6501
|
1 |
--Created by Patrick Nielsen
|
|
2 |
--It's been so fun to create this, your welcome to contact me at Trivkz@gmail.com
|
|
3 |
--
|
|
4 |
--I've tried to keep the code as clear as possible and with comments.
|
|
5 |
--But as English is not my first language there may be spelling / grammar mistakes.
|
|
6 |
--
|
|
7 |
--I know there need to be more "tutorial" specefic messages, but I had a hard timer figuring out what to type / what would be the best technical description.
|
|
8 |
|
|
9 |
|
|
10 |
loadfile( GetDataPath() .. "Scripts/Locale.lua" )()
|
|
11 |
loadfile( GetDataPath() .. "Scripts/Utils.lua" )() -- For the gearIsInBox function, wrote my own, but decided it was a waste to include it
|
|
12 |
|
|
13 |
local Player = nil -- Pointer to hog created in: onGameInit
|
|
14 |
local Target = nil -- Pointer to target hog
|
|
15 |
local GameLost = false -- You lost the game
|
|
16 |
local Objective = false -- Get to the target
|
|
17 |
|
|
18 |
local WaitTime = 10000 -- Wait 10sec before quit
|
|
19 |
local FollowTime = 1500 -- For use with FollowGear
|
|
20 |
local FollowingGear = false
|
|
21 |
local BaseballIntro = false -- Fail safe for ticker
|
|
22 |
local TargetNumber = 0 -- The current target number
|
|
23 |
|
|
24 |
local TargetPos = {} -- Tabel of targets
|
|
25 |
local Timers = {}
|
|
26 |
local GetTime = 0
|
|
27 |
|
|
28 |
TargetPos[ 1 ] = { X = 1100, Y = 1100, Message = loc("Now find the next target! |Tip: Normally you lose health by falling down, so be careful!") }
|
|
29 |
TargetPos[ 2 ] = { X = 1500, Y = 1490, Message = loc("You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower") }
|
|
30 |
TargetPos[ 3 ] = { X = 2200, Y = 800, Message = loc("The next one is pretty hard! |Tip: You have to do multiple swings!") }
|
|
31 |
TargetPos[ 4 ] = { X = 2870, Y = 400, Message = loc("I don't know how you did that.. But good work! |The next one should be easy as cake for you!") }
|
|
32 |
TargetPos[ 5 ] = { X = 4000, Y = 1750, Message = "" }
|
|
33 |
TargetPos[ 6 ] = { Modifier = true, Func = function() -- Last target is ALWAYS the "winning" target!
|
|
34 |
Info( "Congratulations", "Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!", 0 ) -- Congrats
|
|
35 |
HogSay( Player, loc("Victory!"), SAY_SHOUT) -- You win!
|
|
36 |
PlaySound( sndVictory )
|
|
37 |
|
|
38 |
if TurnTimeLeft >= 250000 then -- If you very fast, unlock the ahievement "Rope Master!"
|
|
39 |
AddCaption( loc( "Achievement Unlocked" ) .. ": " .. loc( "Rope Master!" ),0xffba00ff,capgrpAmmoinfo )
|
|
40 |
PlaySound( sndHomerun )
|
|
41 |
end
|
|
42 |
|
|
43 |
Objective = true
|
|
44 |
end }
|
|
45 |
|
|
46 |
function Info( Title, Text, Icon ) -- I made a small wrapper to ease the process
|
|
47 |
ShowMission( loc("Rope Training"), loc(Title), loc( Text ), Icon, 0 )
|
|
48 |
end
|
|
49 |
|
|
50 |
function NewFollowGear( Gear )
|
|
51 |
FollowingGear = true
|
|
52 |
FollowGear( Gear )
|
|
53 |
end
|
|
54 |
|
|
55 |
function SpawnTarget( PosX, PosY )
|
|
56 |
Target = AddGear( 0, 0, gtTarget, 0, 0, 0, 0 ) -- Create a new target
|
|
57 |
SetGearPosition( Target, PosX, PosY ) -- Set the position of the target
|
|
58 |
NewFollowGear( Target )
|
|
59 |
end
|
|
60 |
|
|
61 |
function AutoSpawn() -- Auto spawn the next target after you've killed the current target!
|
|
62 |
TargetNumber = TargetNumber + 1
|
|
63 |
|
|
64 |
if TargetPos[ TargetNumber ].Modifier then -- If there is a modifier, run the function, only used in the winning target!
|
|
65 |
TargetPos[ TargetNumber ].Func()
|
|
66 |
return true
|
|
67 |
end
|
|
68 |
|
|
69 |
if TargetNumber > 1 then
|
|
70 |
Info( "Aiming Practice", TargetPos[ TargetNumber - 1 ].Message, -amRope )
|
|
71 |
end
|
|
72 |
|
|
73 |
SpawnTarget( TargetPos[ TargetNumber ].X, TargetPos[ TargetNumber ].Y ) -- Spawn target on the next position
|
|
74 |
end
|
|
75 |
|
|
76 |
function InRange( Gear, PosX, PosY, Distance ) -- Fix as the default function didn't do quite what I needed
|
|
77 |
GearX, GearY = GetGearPosition( Gear )
|
|
78 |
|
|
79 |
return GearX >= PosX - Distance and GearX <= PosX + Distance and GearY >= PosY and GearY - Distance <= PosY + Distance
|
|
80 |
end
|
|
81 |
|
|
82 |
function CheckPosition( Hog, Distance ) -- Show a message when you get close to the current target!
|
|
83 |
if (not BaseballIntro and not Objective) and (CurrentHedgehog ~= nil) then --Fail safe check
|
|
84 |
if InRange( Hog, 1100, 1100, Distance ) then -- Check if the player is within predefined position of the first target
|
|
85 |
BaseballIntro = true
|
|
86 |
Info( "Aiming Practice", "Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!", -amRope ) -- Guide them
|
|
87 |
Timer( 10000, "Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!" )
|
|
88 |
end
|
|
89 |
end
|
|
90 |
end
|
|
91 |
|
|
92 |
function Timer( Delay, Message )
|
|
93 |
local Timer = {}
|
|
94 |
Timer.End = GetTime + Delay
|
|
95 |
Timer.Message = Message
|
|
96 |
|
|
97 |
table.insert( Timers, Timer )
|
|
98 |
end
|
|
99 |
|
|
100 |
function onGameInit() -- Called when the game loads
|
|
101 |
Seed = 1 -- The base number for the random number generator
|
|
102 |
GameFlags = gfInfAttack + gfOneClanMode + gfSolidLand + gfInvulnerable + gfBorder -- Game settings and rules, going with a border to make it easier
|
|
103 |
TurnTime = 300000 -- Player can move for 5min each round
|
|
104 |
CaseFreq = 0 -- No random crate drops
|
|
105 |
MinesNum = 0 -- Never place any mines on the map
|
|
106 |
Explosives = 0 -- Never place any explosives
|
|
107 |
Delay = 1 -- We don't wont to wait between each round ( as the only is one )
|
|
108 |
Map = "Ropes" -- Map name
|
|
109 |
Theme = "Nature" -- Map theme
|
|
110 |
|
|
111 |
AddTeam( loc( "Rope Team" ), 14483456, "Simple", "Island", "Default" ) -- Lets make the team
|
|
112 |
Player = AddHog( loc( "Hunter" ), 0, 1, "StrawHat" ) -- Add a hog for it, and name it "Hunter"
|
|
113 |
SetGearPosition( Player, 420, 1750 ) -- Set player position
|
|
114 |
|
|
115 |
SetEffect( Player, heResurrectable, true ) -- By Suggestion :)
|
|
116 |
end
|
|
117 |
|
|
118 |
function onGameStart() -- Called when the game starts
|
|
119 |
AutoSpawn() -- Spawn our 1st target using the wrapper function
|
|
120 |
|
|
121 |
SetHealth( Player, 100 ) -- Give the player 100 Health points
|
|
122 |
|
|
123 |
Info( "Aiming Practice", "Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!", -amRope ) -- Short intro to tell the player what to do
|
|
124 |
Timer( 10000, "Tip: The rope physics are different than in the real world, |use it to your advantage!" ) -- After 15 sec, give them more help
|
|
125 |
end
|
|
126 |
|
|
127 |
function onNewTurn()
|
|
128 |
ParseCommand( "setweap " .. string.char( amRope ) ) -- Set the default weapon to Rope
|
|
129 |
end
|
|
130 |
|
|
131 |
function onGameTick()
|
|
132 |
if TurnTimeLeft == 1 then -- Round starts at 0, so we check if the round is finished by using 1
|
|
133 |
GameLost = true -- You lost the game
|
|
134 |
Info( "Aiming Practice", "You did not make it in time, try again!", -amSkip )
|
|
135 |
SetHealth( Player, 0 ) -- Kill the player so he can't keep moving!
|
|
136 |
|
|
137 |
SetEffect( Player, heResurrectable, false )
|
|
138 |
|
|
139 |
end
|
|
140 |
|
|
141 |
-- If the player gets to the last target, they win OR
|
|
142 |
-- If round is finished and your not at the target you lose
|
|
143 |
-- in either case, end the game
|
|
144 |
if (Objective == true) or (GameLost == true) then
|
|
145 |
if (WaitTime == 0) then
|
|
146 |
ParseCommand("teamgone " .. loc( "Rope Team" ))
|
|
147 |
|
|
148 |
--SetHealth( Player, 0 ) -- Kill the player so he can't keep moving!
|
|
149 |
--SetEffect( Player, heResurrectable, false )
|
|
150 |
TurnTimeLeft = 1
|
|
151 |
|
|
152 |
WaitTime = -1
|
|
153 |
else
|
|
154 |
WaitTime = WaitTime - 1
|
|
155 |
end
|
|
156 |
end
|
|
157 |
|
|
158 |
if FollowingGear == true then
|
|
159 |
if FollowTime == 0 then
|
|
160 |
FollowingGear = false
|
|
161 |
FollowTime = 1500
|
|
162 |
FollowGear( Player )
|
|
163 |
else
|
|
164 |
FollowTime = FollowTime - 1
|
|
165 |
end
|
|
166 |
end
|
|
167 |
|
|
168 |
for k, v in pairs( Timers ) do
|
|
169 |
if v.End <= GetTime then
|
|
170 |
Info( "Aiming Practice", v.Message, -amRope )
|
|
171 |
Timers[ k ] = nil
|
|
172 |
end
|
|
173 |
end
|
|
174 |
|
|
175 |
GetTime = GetTime + 1
|
|
176 |
|
|
177 |
CheckPosition( Player, 70 ) -- Run the CheckPosition function to check if the player is close to a target
|
|
178 |
end
|
|
179 |
|
|
180 |
function onAmmoStoreInit()
|
|
181 |
SetAmmo( amRope, 9, 2, 0, 0 ) -- Player ammo, Rope
|
|
182 |
SetAmmo( amBaseballBat, 9, 2, 0, 0 ) --Baseball bat
|
|
183 |
end
|
|
184 |
|
|
185 |
function onGearResurrect( Gear )
|
|
186 |
if TargetNumber > 1 then
|
|
187 |
SetGearPosition( Player, TargetPos[ TargetNumber - 1 ].X, TargetPos[ TargetNumber - 1 ].Y ) -- If the player dies spawn him where he last killed a target
|
|
188 |
Info( "Aiming Practice", "You have been respawned, at your last checkpoint!", -amRope )
|
|
189 |
else
|
|
190 |
SetGearPosition( Player, 420, 1750 ) -- If the player dies and didn't kill a target just spawn him at the default spawn
|
|
191 |
Info( "Aiming Practice", "You have been respawned, be more carefull next time!", -amRope )
|
|
192 |
end
|
|
193 |
end
|
|
194 |
|
|
195 |
function onGearDelete( Gear )
|
|
196 |
if GetGearType( Gear ) == gtTarget then
|
|
197 |
AutoSpawn() -- When a target is deleted / destroyed, spawn a new one!
|
|
198 |
end
|
|
199 |
end
|