Skip to content

Commit 6cfde96

Browse files
Merge stuff
1 parent 7c65a88 commit 6cfde96

File tree

314 files changed

+1773
-470
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

314 files changed

+1773
-470
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,5 @@ LogLoadingWarning.txt
101101
LogConsole.txt
102102
Console.dump.log
103103
Console.input.log
104+
Data/Base.rte/GUIs/Skins/Menus/SkinGreen.png
105+
Data/Base.rte/GUIs/Skins/SkinGreen.png

CHANGELOG.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
4444

4545
- The Signal Hunt activity no longer has a preview image, as it was not formatted correctly and spoiled the interior structure of the cave.
4646

47-
- `MovableObject`'s `UniqueID` and `Age` fields are now persisted through game save/load.
48-
4947
</details>
5048

5149
<details><summary><b>Fixed</b></summary>

Data/Base.rte/AI/HumanBehaviors.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1852,7 +1852,7 @@ function HumanBehaviors.GoToWpt(AI, Owner, Abort)
18521852
local Trace = SceneMan:ShortestDistance(Owner.Head.Pos, FallPos, false);
18531853
SceneMan:CastObstacleRay(Owner.Head.Pos, Trace, FallPos, Vector(), Owner.ID, Owner.IgnoresWhichTeam, rte.grassID, 3);
18541854

1855-
local deltaToJump = 25;
1855+
local deltaToJump = 15;
18561856
if Owner.Jetpack.JetpackType == AEJetpack.JumpPack then
18571857
deltaToJump = deltaToJump * 1.4;
18581858
end
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
--------------------------------------- Instructions ---------------------------------------
2+
3+
------- Require this in your script like so:
4+
5+
-- self.GameIntensityCalculator = require("Activities/Utility/GameIntensityCalculator");
6+
-- self.GameIntensityCalculator:Initialize(Activity, bool newGame, bool verboseLogging, number intensityValuePerHPBarLost, number intensityDegradationRatePerSecond);
7+
8+
-- Call self.GameIntensityCalculator:UpdateGameIntensityCalculator() every frame.
9+
10+
-- The main update function will return an intensity number between 0 and 1.
11+
-- This corresponds to how much damage has been dealt directly within all the player's views.
12+
-- Use the two number arguments to control how the intensity value rises and falls.
13+
-- One "HP Bar" is considered a standard 100 HP.
14+
15+
------- Saving/Loading
16+
17+
-- Saving and loading requires you to also have the SaveLoadHandler ready.
18+
-- Simply run OnSave(instancedSaveLoadHandler) and OnLoad(instancedSaveLoadHandler) when appropriate.
19+
20+
--------------------------------------- Misc. Information ---------------------------------------
21+
22+
--
23+
24+
25+
26+
27+
local GameIntensityCalculator = {};
28+
29+
function GameIntensityCalculator:Create()
30+
local Members = {};
31+
32+
setmetatable(Members, self);
33+
self.__index = self;
34+
35+
return Members;
36+
end
37+
38+
function GameIntensityCalculator:Initialize(activity, newGame, intensityValuePerHPBarLost, intensityDegradationRatePerSecond, verboseLogging)
39+
self.verboseLogging = verboseLogging
40+
41+
self.Activity = activity;
42+
43+
if not intensityValuePerHPBarLost then
44+
intensityValuePerHPBarLost = 0.2;
45+
end
46+
if not intensityDegradationRatePerSecond then
47+
intensityDegradationRatePerSecond = 0.01;
48+
end
49+
50+
-- One "HP Bar" is considered 100 HP
51+
self.intensityValuePerHPBarLost = intensityValuePerHPBarLost;
52+
53+
self.intensityDegradationRatePerSecond = intensityDegradationRatePerSecond;
54+
55+
if newGame then
56+
self.saveTable = {};
57+
self.saveTable.CurrentIntensity = -0.5;
58+
end
59+
60+
print("INFO: GameIntensityCalculator initialized!")
61+
end
62+
63+
function GameIntensityCalculator:OnLoad(saveLoadHandler)
64+
print("INFO: GameIntensityCalculator loading...");
65+
self.saveTable = saveLoadHandler:ReadSavedStringAsTable("GameIntensityCalculatorMainTable");
66+
print("INFO: GameIntensityCalculator loaded!");
67+
end
68+
69+
function GameIntensityCalculator:OnSave(saveLoadHandler)
70+
print("INFO: GameIntensityCalculator saving...");
71+
saveLoadHandler:SaveTableAsString("GameIntensityCalculatorMainTable", self.saveTable);
72+
print("INFO: GameIntensityCalculator saved!");
73+
end
74+
75+
function GameIntensityCalculator:GetCurrentIntensity()
76+
return math.min(1, self.saveTable.CurrentIntensity, math.max(0, self.saveTable.CurrentIntensity));
77+
end
78+
79+
function GameIntensityCalculator:UpdateGameIntensityCalculator()
80+
self.saveTable.CurrentIntensity = math.max(-0.5, self.saveTable.CurrentIntensity - (self.intensityDegradationRatePerSecond * TimerMan.DeltaTimeSecs));
81+
82+
local healthLostThisFrame = 0;
83+
84+
for player = Activity.PLAYER_1, Activity.MAXPLAYERCOUNT - 1 do
85+
if self.Activity:PlayerActive(player) and self.Activity:PlayerHuman(player) then
86+
local screenBox = Box(CameraMan:GetOffset(player), CameraMan:GetOffset(player) + Vector(FrameMan.PlayerScreenWidth, FrameMan.PlayerScreenHeight));
87+
for mo in MovableMan:GetMOsInBox(screenBox, -1, true) do
88+
if IsActor(mo) then
89+
mo = ToActor(mo);
90+
healthLostThisFrame = math.max(0, healthLostThisFrame + mo.PrevHealth - mo.Health);
91+
end
92+
end
93+
end
94+
end
95+
96+
if healthLostThisFrame > 0 then
97+
--print("health lost this frame: " .. healthLostThisFrame);
98+
end
99+
100+
self.saveTable.CurrentIntensity = math.min(1.25, self.saveTable.CurrentIntensity + self.intensityValuePerHPBarLost * (healthLostThisFrame/100))
101+
102+
--print("intensity: " .. self.saveTable.CurrentIntensity);
103+
104+
return math.min(1, self.saveTable.CurrentIntensity, math.max(0, self.saveTable.CurrentIntensity));
105+
end
106+
107+
108+
return GameIntensityCalculator:Create();

Data/Base.rte/Activities/Utility/SaveLoadHandler.lua

Lines changed: 178 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@
3131
-- a UniqueID is just a number, so SaveLoadHandler will save it as such instead of using its special MO method. UniqueIDs reset on game load too,
3232
-- so they are no longer the same anyway.
3333

34-
-- Note that still-valid entities that nonetheless only exist in the lua state and not in the simulation can't really be saved and loaded. Those are wiped
35-
-- as soon as the lua state is deleted (i.e. you save and quit a game).
34+
-- Also, SaveLoadHandler's MO parsing method relies on trawling through entities owned by MovableMan, which means entities that actually exist in the simulation,
35+
-- including those in the inventory of Actors that exist in the simulation.
36+
-- Yes, this means that valid entities that only exist in the lua state and not in the simulation can't really be saved and loaded. Those are wiped
37+
-- as soon a the lua state is deleted (i.e. you save and quit a game).
3638

3739
local SaveLoadHandler = {}
3840

@@ -91,6 +93,7 @@ function SaveLoadHandler:SerializeTable(val, name, skipnewlines, depth)
9193
elseif val.Magnitude then -- ghetto vector check
9294
tmp = tmp .. string.format("%q", "Vector(" .. val.X .. "," .. val.Y .. ")")
9395
elseif val.PresetName and IsMOSRotating(val) then -- IsMOSRotating freaks out if we give it something that isn't a preset at all... ghetto here too
96+
val:SetNumberValue("saveLoadHandlerUniqueID", val.UniqueID);
9497
tmp = tmp .. string.format("%q", "SAVELOADHANDLERUNIQUEID_" .. tostring(val.UniqueID))
9598
elseif val.FirstBox then -- ghetto area check
9699
tmp = tmp .. string.format("%q", "SAVELOADHANDLERAREA_" .. tostring(val.Name))
@@ -109,14 +112,109 @@ function SaveLoadHandler:SerializeTable(val, name, skipnewlines, depth)
109112
return tmp
110113
end
111114

115+
function SaveLoadHandler:FindMOWithId(id)
116+
for act in MovableMan.AddedActors do
117+
if math.abs(act:GetNumberValue("saveLoadHandlerUniqueID")) == id then
118+
--act:removeNumberValue("saveLoadHandlerUniqueID");
119+
return act;
120+
end
121+
for item in act.Inventory do
122+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
123+
--item:removeNumberValue("saveLoadHandlerUniqueID");
124+
return item;
125+
end
126+
end
127+
for att in ToMOSRotating(act).Attachables do
128+
if math.abs(att:GetNumberValue("saveLoadHandlerUniqueID")) == id then
129+
--item:removeNumberValue("saveLoadHandlerUniqueID");
130+
return att;
131+
end
132+
end
133+
end
134+
for act in MovableMan.Actors do
135+
if math.abs(act:GetNumberValue("saveLoadHandlerUniqueID")) == id then
136+
--act:removeNumberValue("saveLoadHandlerUniqueID");
137+
return act;
138+
end
139+
for item in act.Inventory do
140+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
141+
--item:removeNumberValue("saveLoadHandlerUniqueID");
142+
return item;
143+
end
144+
end
145+
for att in ToMOSRotating(act).Attachables do
146+
if math.abs(att:GetNumberValue("saveLoadHandlerUniqueID")) == id then
147+
--item:removeNumberValue("saveLoadHandlerUniqueID");
148+
return att;
149+
end
150+
end
151+
end
152+
153+
for item in MovableMan.AddedItems do
154+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
155+
--item:removeNumberValue("saveLoadHandlerUniqueID");
156+
return item;
157+
end
158+
for att in ToMOSRotating(item).Attachables do
159+
if math.abs(att:GetNumberValue("saveLoadHandlerUniqueID")) == id then
160+
--item:removeNumberValue("saveLoadHandlerUniqueID");
161+
return att;
162+
end
163+
end
164+
end
165+
for item in MovableMan.Items do
166+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
167+
--item:removeNumberValue("saveLoadHandlerUniqueID");
168+
return item;
169+
end
170+
for att in ToMOSRotating(item).Attachables do
171+
if math.abs(att:GetNumberValue("saveLoadHandlerUniqueID")) == id then
172+
--item:removeNumberValue("saveLoadHandlerUniqueID");
173+
return att;
174+
end
175+
end
176+
end
177+
178+
for particle in MovableMan.AddedParticles do
179+
if math.abs(particle:GetNumberValue("saveLoadHandlerUniqueID")) == id then
180+
--particle:removeNumberValue("saveLoadHandlerUniqueID");
181+
return particle;
182+
end
183+
if IsMOSRotating(particle) then
184+
for att in ToMOSRotating(particle).Attachables do
185+
if math.abs(att:GetNumberValue("saveLoadHandlerUniqueID")) == id then
186+
--item:removeNumberValue("saveLoadHandlerUniqueID");
187+
return att;
188+
end
189+
end
190+
end
191+
end
192+
for particle in MovableMan.Particles do
193+
if math.abs(particle:GetNumberValue("saveLoadHandlerUniqueID")) == id then
194+
--particle:removeNumberValue("saveLoadHandlerUniqueID");
195+
return particle;
196+
end
197+
if IsMOSRotating(particle) then
198+
for att in ToMOSRotating(particle).Attachables do
199+
if math.abs(att:GetNumberValue("saveLoadHandlerUniqueID")) == id then
200+
--item:removeNumberValue("saveLoadHandlerUniqueID");
201+
return att;
202+
end
203+
end
204+
end
205+
end
206+
207+
return nil;
208+
end
209+
112210
function SaveLoadHandler:ParseTableForMOs(tab)
113211
for k, v in pairs(tab) do
114212
if type(v) == "string" and string.find(v, "SAVELOADHANDLERUNIQUEID_") then
115213
local id = math.abs(tonumber(string.sub(v, 25, -1)));
116214
if SaveLoadHandler.verboseLogging then
117-
print("INFO: SaveLoadHandler is looking for this ID: " .. id)
215+
print("INFO: SaveLoadHandler is parsing looking for this ID: " .. id)
118216
end
119-
local mo = MovableMan:FindObjectByUniqueID(id);
217+
local mo = self:FindMOWithId(id);
120218
if mo then
121219
tab[k] = mo;
122220
if SaveLoadHandler.verboseLogging then
@@ -125,7 +223,7 @@ function SaveLoadHandler:ParseTableForMOs(tab)
125223
end
126224
else
127225
print("ERROR: SaveLoadHandler could not resolve a saved MO UniqueID! A loaded table is likely broken.");
128-
print("The saved ID including SaveLoadHandler prefix was: " .. v)
226+
print("The saved ID was: " .. v)
129227
end
130228
elseif type(v) == "table" then
131229
self:ParseTableForMOs(v);
@@ -180,13 +278,6 @@ end
180278

181279
function SaveLoadHandler:DeserializeTable(serializedTable, name)
182280

183-
-- for mo in MovableMan.AddedParticles do
184-
-- print(mo.UniqueID)
185-
-- end
186-
-- for mo in MovableMan.AddedActors do
187-
-- print(mo.UniqueID)
188-
-- end
189-
190281
local tab = loadstring("return " .. serializedTable)()
191282
-- Parse for saved MOSRotatings
192283
-- Very mildly inefficient in terms of looping even after resolving a value, but it happens once on startup
@@ -227,24 +318,92 @@ function SaveLoadHandler:SaveTableAsString(name, tab)
227318
end
228319

229320
function SaveLoadHandler:SaveMOLocally(self, name, mo)
230-
self:SetNumberValue(name, mo.UniqueID);
321+
mo:SetNumberValue("saveLoadHandlerUniqueID", mo.UniqueID);
322+
self:SetStringValue(name, "SAVELOADHANDLERUNIQUEID_" .. tostring(mo.UniqueID));
231323
end
232324

233325
function SaveLoadHandler:LoadLocallySavedMO(self, name)
234-
local id = self:GetNumberValue(name);
235-
self:RemoveNumberValue(name);
326+
local v = self:GetStringValue(name);
327+
local didNotFindAnMO = false;
236328

329+
local notFound = true;
237330
if SaveLoadHandler.verboseLogging then
238331
print("INFO: SaveLoadHandler is finding this locally saved MO: " .. name);
239332
end
240-
local mo = MovableMan:FindObjectByUniqueID(id);
333+
local id = math.abs(tonumber(string.sub(v, 25, -1)));
334+
for particle in MovableMan.AddedParticles do
335+
if math.abs(particle:GetNumberValue("saveLoadHandlerUniqueID")) == id then
336+
--particle:removeNumberValue("saveLoadHandlerUniqueID");
337+
v = particle;
338+
notFound = false;
339+
break;
340+
end
341+
end
342+
for act in MovableMan.AddedActors do
343+
if math.abs(act:GetNumberValue("saveLoadHandlerUniqueID")) == id then
344+
--act:removeNumberValue("saveLoadHandlerUniqueID");
345+
v = act;
346+
notFound = false;
347+
break;
348+
end
349+
for item in act.Inventory do
350+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
351+
--item:removeNumberValue("saveLoadHandlerUniqueID");
352+
v = item;
353+
notFound = false;
354+
break;
355+
end
356+
end
357+
end
358+
for item in MovableMan.AddedItems do
359+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
360+
--item:removeNumberValue("saveLoadHandlerUniqueID");
361+
v = item;
362+
notFound = false;
363+
break;
364+
end
365+
end
366+
for particle in MovableMan.Particles do
367+
if math.abs(particle:GetNumberValue("saveLoadHandlerUniqueID")) == id then
368+
--particle:removeNumberValue("saveLoadHandlerUniqueID");
369+
v = particle;
370+
notFound = false;
371+
break;
372+
end
373+
end
374+
for act in MovableMan.Actors do
375+
if math.abs(act:GetNumberValue("saveLoadHandlerUniqueID")) == id then
376+
--act:removeNumberValue("saveLoadHandlerUniqueID");
377+
v = act;
378+
notFound = false;
379+
break;
380+
end
381+
for item in act.Inventory do
382+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
383+
--item:removeNumberValue("saveLoadHandlerUniqueID");
384+
v = item;
385+
notFound = false;
386+
break;
387+
end
388+
end
389+
end
390+
for item in MovableMan.Items do
391+
if math.abs(item:GetNumberValue("saveLoadHandlerUniqueID")) == id then
392+
--item:removeNumberValue("saveLoadHandlerUniqueID");
393+
v = item;
394+
notFound = false;
395+
break;
396+
end
397+
end
241398

242-
if mo then
243-
return mo;
244-
else
399+
if notFound then
245400
print("ERROR: SaveLoadHandler could not resolve a locally saved MO!");
246401
return false;
247402
end
403+
404+
self:RemoveStringValue(name);
405+
406+
return v;
248407

249408
end
250409

0 commit comments

Comments
 (0)