File: derelict.lua

package info (click to toggle)
naev 0.8.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 386,084 kB
  • sloc: ansic: 93,149; xml: 87,292; python: 2,347; sh: 904; makefile: 654; lisp: 162; awk: 4
file content (214 lines) | stat: -rw-r--r-- 12,256 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
--[[
<?xml version='1.0' encoding='utf8'?>
<event name="Derelict">
  <trigger>enter</trigger>
  <chance>10</chance>
  <cond>system.cur():faction() ~= nil</cond>
  <notes>
   <tier>1</tier>
  </notes>
 </event>
 --]]
--[[
-- Derelict Event
--
-- Creates a derelict ship that spawns random events.
--]]

-- Text goes here. Please keep the section as organized as possible.

--=== NEUTRAL EVENTS ===--
ntitle = _("Empty derelict")
ntext = {}
ntext[1] = _([[You spend some time searching the derelict, but it doesn't appear there are any remaining passengers, nor is there anything of interest to you. You decide to return to your ship.]])
ntext[2] = _([[This ship has clearly been abandoned a long time ago. Looters have been here many times, and all of the primary and backup systems are down. However, there is one console that is still operational. It appears to be running an ancient computer game about space exploration, trade and combat. Intrigued, you decide to give the game a try, and before long you find yourself hooked on it. You spend many fun periods hauling cargo, upgrading your ship, fighting enemies and exploring the universe. But of course you can't stay here forever. You regretfully leave the game behind and return to the reality of your everyday life.]])
ntext[3] = _([[You are exploring the derelict ship when you hear a strange creaking noise. You decide to follow it to see what is causing it, but you never seem to be able to pinpoint the source. After about an hour of fruitlessly opening up panels, pressing your ear against the deck and running hull scans from your own ship, you decide to give up and leave the derelict to its creepy creaking.]])
ntext[4] = _([[While exploring the cockpit of this derelict, you come across the captain's logs. Hoping to find some information that could be of use to you, you decide to play back the most recent entries. Unfortunately, it turns out the captain's logs are little more than recordings of the captain having heated arguments with her co-pilot. After about ten hectoseconds, you decide you probably aren't going to find anything worthwhile here, so you return to your ship.]])
ntext[5] = _([[This derelict is not deserted. The crew are still onboard. Unfortunately for them, they didn't survive whatever wrecked their ship. You decide to give them a decent space burial before moving on.]])
ntext[6] = _([[This derelict seems to have been visited by looters already. You find a message carved into the wall near the airlock. It reads: "I WUS HEAR". Below it is another carved message that says "NO U WASNT". Otherwise, there is nothing of interest left on this ship.]])
ntext[7] = _([[This derelict seems to have at one time been used as an illegal casino. There are roulette tables and slot machines set up in the cargo hold. However, it seems the local authorities caught wind of the operation, because there are also scorch marks on the furniture and the walls, and there are assault rifle shells underfoot. You don't reckon you're going to find anything here, so you leave.]])
ntext[8] = _([[When the airlock opens, you are hammered in the face by an ungodly smell that almost makes you pass out on the spot. You hurriedly close the airlock again and flee back into your own ship. Whatever is on that derelict, you don't want to find out!]])
ntext[9] = _([[This derelict has really been beaten up badly. Most of the corridors are blocked by mangled metal, and your scans read depressurized compartments all over the ship. There's not much you can do here, so you decide to leave the derelict alone.]])
ntext[10] = _([[The interior of this ship is decorated in a gaudy fashion. There are cute plushies hanging from the doorways, drapes on every viewport, colored pillows in the corners of most compartments and cheerful graffiti on almost all the walls. A scan of the ship's computer shows that this ship belonged to a trio of adventurous young ladies who decided to have a wonderful trip through space. Sadly, it turned out none of them really knew how to fly a space ship, and so they ended up stranded and had to be rescued. Shaking your head, you return to your own ship.]])
ntext[11] = _([[The artificial gravity on this ship has bizarrely failed, managing to somehow reverse itself. As soon as you step aboard you fall upwards and onto the ceiling, getting some nasty bruises in the process. Annoyed, you search the ship, but without result. You return to your ship - but forget about the polarized gravity at the airlock, so you again smack against the deck plates.]])
ntext[12] = _([[The cargo hold of this ship contains several heavy, metal chests. You pry them open, but they are empty. Whatever was in them must have been pilfered by other looters already. You decide not to waste any time on this ship, and return to your own.]])
ntext[13] = _([[You have attached your docking clamp to the derelict's airlock, but the door refuses to open. A few diagnostics reveal that the other side isn't pressurized. The derelict must have suffered hull breaches over the years. It doesn't seem like there's much you can do here.]])
ntext[14] = _([[As you walk through the corridors of the derelict, you can't help but notice the large scratch marks on the walls, the floor and even the ceiling. It's as if something went on a rampage throughout this ship - something big, with a lot of very sharp claws and teeth... You feel it might be best to leave as soon as possible, so you abandon the search of the derelict and disengage your docking clamp.]])

--=== GOOD EVENTS ===--
gtitle = _("Lucky find!")
gtext = {}
gtext[1] = _([[The derelict appears deserted, its passengers long gone. However, they seem to have left behind a small amount of credit chips in their hurry to leave! You decide to help yourself to them, and leave the derelict.]])
gtext[2] = _([[The derelict is empty, and seems to have been thoroughly picked over by other space buccaneers. However, the ship's computer contains a map of the %s! You download it into your own computer.]])
gtext[3] = _([[This ship looks like any old piece of scrap at a glance, but it is actually an antique, one of the very first of its kind ever produced! Museums all over the galaxy would love to have a ship like this. You plant a beacon on the derelict to mark it for salvaging, and contact the %s authorities. Your reputation with them has slightly improved.]])

--=== BAD EVENTS ===--
btitle = _("Oh no!")
btext = {}
btext[1] = _([[The moment you affix your boarding clamp to the derelict ship, it triggers a booby trap! The derelict explodes, severely damaging your ship. You escaped death this time, but it was a close call!]])
btext[2] = _([[You board the derelict ship and search its interior, but you find nothing. When you return to your ship, however, it turns out there were Space Leeches onboard the derelict - and they've now attached themselves to your ship! You scorch them off with a plasma torch, but it's too late. The little buggers have already drunk all of your fuel. You're not jumping anywhere until you find some more!]])
btext[3] = _([[You affix your boarding clamp and walk aboard the derelict ship. You've only spent a couple of hectoseconds searching the interior when there is a proximity alarm from your ship! Pirates are closing on your position! Clearly this derelict was a trap! You run back onto your ship and prepare to unboard, but you've lost precious time. The pirates are already in firing range...]])

--=== MISSION EVENTS ===--
-- Add the name of your mission to this list. It will automatically have a chance of triggering from the derelict. The event handles unboarding.
missionlist = {}


function create ()

    -- Get the derelict's ship.
    r = rnd.rnd()
    if r > 0.8 then
        ship = "Trader Gawain"
    elseif r > 0.6 then
        ship = "Trader Mule"
    elseif r > 0.4 then
        ship = "Trader Koala"
    else 
        ship = "Trader Llama"
    end
    
    -- Create the derelict.
    angle = rnd.rnd() * 2 * math.pi
    dist  = rnd.rnd(400, system.cur():radius() * 0.6)
    pos   = vec2.new( dist * math.cos(angle), dist * math.sin(angle) )
    p     = pilot.add(ship, "dummy", pos)[1]
    p:setFaction("Derelict")
    p:disable()
    p:rename("Derelict")
    hook.pilot(p, "board", "board")
    hook.pilot(p, "death", "destroyevent")
    hook.jumpout("destroyevent")
    hook.land("destroyevent")
end

function board()
    player.unboard()
    -- Roll for events
    local prob = rnd.rnd()
    if prob <= 0.50 then
        neutralevent()
    elseif prob <= 0.70 then
        goodevent()
    elseif prob <= 0.85 then
        badevent()
    else
        missionevent()
    end
end

function neutralevent()
    -- Pick a random message from the list, display it, unboard.
    tk.msg(ntitle, ntext[rnd.rnd(1, #ntext)])
    destroyevent()
end

function goodevent()
    -- Roll for good event, handle accordingly
    event = rnd.rnd(1, #gtext)

    -- Only give a map if unknown.
    if event == 2 then
        maps = {
            ["Map: Dvaered-Soromid trade route"] = _("Dvaered-Soromid trade route"),
            ["Map: Sirian border systems"] = _("Sirian border systems"),
            ["Map: Dvaered Core"] = _("Dvaered core systems"),
            ["Map: Empire Core"]  = _("Empire core systems"),
            ["Map: Nebula Edge"]  = _("Sol nebula edge"),
            ["Map: The Frontier"] = _("Frontier systems")
        }
        unknown = {}

        for k,v in pairs(maps) do
            if player.numOutfit(k) == 0 then
                table.insert( unknown, k )
            end
        end

        -- All maps are known.
        if #unknown == 0 then
            while event == 2 do
                event = rnd.rnd(1, #gtext)
            end
        end
    end


    if event == 1 then
        tk.msg(gtitle, gtext[1])
        player.pay(rnd.rnd(5000,30000)) --5K - 30K
    elseif event == 2 then
        local choice = unknown[rnd.rnd(1,#unknown)]
        tk.msg(gtitle, gtext[2]:format(maps[choice]))
        player.addOutfit(choice, 1)
    elseif event == 3 then
        local factions = {"Empire", "Dvaered", "Sirius", "Soromid"} -- TODO: Add more factions as they appear
        rndfact = factions[rnd.rnd(1, #factions)]
        tk.msg(gtitle, string.format(gtext[3], rndfact))
        faction.modPlayerSingle(rndfact, 3)
    end
    destroyevent()
end

function badevent()
    -- Roll for bad event, handle accordingly
    event = rnd.rnd(1, #btext)
    if event == 1 then
        p:hookClear() -- So the pilot doesn't end the event by dying.
        tk.msg(btitle, btext[1])
        p:setHealth(0,0)
        player.pilot():control(true)
        hook.pilot(p, "exploded", "derelict_exploded")
    elseif event == 2 then
        tk.msg(btitle, btext[2])
        player.pilot():setFuel(false)
        destroyevent()
    elseif event == 3 then
        tk.msg(btitle, btext[3])
        v1 = pilot.add("Pirate Vendetta", "pirate", player.pos() + vec2.new( 300, 300))[1]
        v2 = pilot.add("Pirate Vendetta", "pirate", player.pos() + vec2.new(-300, 300))[1]
        a1 = pilot.add("Pirate Ancestor", "pirate", player.pos() + vec2.new(-300,-300))[1]
        a2 = pilot.add("Pirate Ancestor", "pirate", player.pos() + vec2.new( 300,-300))[1]
        v1:control()
        v1:attack(player.pilot())
        v2:control()
        v2:attack(player.pilot())
        a1:control()
        a1:attack(player.pilot())
        a2:control()
        a2:attack(player.pilot())
        destroyevent()
    end
end

function derelict_exploded()
   player.pilot():control(false)
   player.pilot():setHealth(42, 0)
  destroyevent()
end

function missionevent()
    -- Fetch all missions that haven't been flagged as done yet.
    local mymissions = {}
    
    for i, mission in ipairs(missionlist) do
        if not player.misnDone(mission) then
            mymissions[#mymissions + 1] = mission
        end
    end
    
    -- If no missions are available, default to a neutral event.
    if #mymissions == 0 then
        neutralevent()
    else
        -- Roll a random mission and start it.
        local select = rnd.rnd(1, #mymissions)
        naev.missionStart(mymissions[select])
    
        destroyevent()
    end
end

function destroyevent()
    evt.finish()
end