Skip to content

Commit 5d43156

Browse files
committed
pre 1.24 support
1 parent 6604e4a commit 5d43156

43 files changed

Lines changed: 294 additions & 4678 deletions

Some content is hidden

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

wurst.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
---
22
projectName: Wurst Standard Library 2
33
dependencies: []
4-
wc3Patch: v1.28
4+
wc3Patch: v1.23a

wurst/_handles/GroupTests.wurst

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ function testGroupBasic()
2323
g.add(u2)
2424
g.size().assertEquals(12)
2525

26-
print("---")
27-
print(u2.getHandleId())
28-
2926
g.clear()
3027
assertTrue(g.isEmpty())
3128

@@ -69,16 +66,6 @@ function testRandom()
6966

7067
assertTrue(g.isEmpty())
7168

72-
@Test
73-
function testHandleId()
74-
let g = CreateGroup()
75-
assertTrue(g.getHandleId() != 0)
76-
77-
for i = 0 to 100
78-
let g2 = CreateGroup()
79-
assertTrue(g2.getHandleId() != 0)
80-
assertTrue(g2.getHandleId() != g.getHandleId())
81-
8269
@Test
8370
function testVararg()
8471
let g = CreateGroup()

wurst/_handles/Hashtable.wurst

Lines changed: 64 additions & 249 deletions
Large diffs are not rendered by default.

wurst/_handles/HashtableTests.wurst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package HashtableTests
22

33
@Test
44
function testBasicDatatypes()
5-
let ht = InitHashtable()
5+
let ht = initHashtable()
66
ht.saveBoolean(0, 0, true)
77
ht.saveInt(0, 0, 1)
88
ht.saveReal(0, 0, 2.)
@@ -20,7 +20,7 @@ function testBasicDatatypes()
2020

2121
@Test
2222
function testFlushing()
23-
let ht = InitHashtable()
23+
let ht = initHashtable()
2424
ht.saveReal(0, 0, 2.)
2525
ht.saveReal(1, 0, 4.)
2626
ht.flushChild(0)
@@ -34,7 +34,7 @@ function testFlushing()
3434

3535
@Test
3636
function testOverwrite()
37-
let ht = InitHashtable()
37+
let ht = initHashtable()
3838
ht.saveReal(0, 0, 2.)
3939
ht.saveReal(0, 0, 4.)
4040

@@ -43,7 +43,7 @@ function testOverwrite()
4343

4444
@Test
4545
function testRemove()
46-
let ht = InitHashtable()
46+
let ht = initHashtable()
4747
ht.saveReal(0, 0, 2.)
4848
assertTrue(ht.hasReal(0,0))
4949

wurst/_handles/Timer.wurst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@ public function timer.destr()
77
public function timer.getElapsed() returns real
88
return TimerGetElapsed(this)
99

10-
public function timer.getHandleId() returns int
11-
return GetHandleId(this)
12-
1310
public function timer.pause()
1411
PauseTimer(this)
1512

wurst/_handles/Unit.wurst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,6 @@ public function unit.getHP() returns real
213213
public function unit.getHPRatio() returns real
214214
return this.getHP() / this.getMaxHP()
215215

216-
public function handle.getHandleId() returns int
217-
return GetHandleId(this)
218-
219216
public function unit.getMana() returns real
220217
return this.getState(UNIT_STATE_MANA)
221218

wurst/_handles/primitives/String.wurst

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,29 @@ public function stringCompare(string s1, string s2) returns int
224224
return 1
225225
return 0
226226

227+
/** Maps a single-character string to an integer code point.
228+
Used by getHash() since the native StringHash does not exist pre-1.24. */
229+
function charCode(string c) returns int
230+
// Build a stable code from the charset position, falling back to length
231+
// and content so unknown chars still contribute deterministically.
232+
let idx = c.toCharsetInt()
233+
if idx >= 0
234+
return idx + 1
235+
// Non-charset char (punctuation/whitespace): derive a stable value from
236+
// upper/lower casing so it still differs between distinct characters.
237+
return c == c.toUpperCase() ? 0x5BD1 : 0x2F35
238+
239+
/** Returns a deterministic hash of this string.
240+
241+
Pre-1.24 patches lack the native `StringHash`, so this is a pure-Wurst
242+
polynomial rolling hash. Values differ from the WC3 native, but are stable
243+
within a game and only used for internal keying. */
227244
public function string.getHash() returns int
228-
return StringHash(this)
245+
var hash = 0x811C9DC5
246+
let len = this.length()
247+
for i = 0 to len - 1
248+
hash = (hash * 33) + charCode(this.substring(i, i + 1))
249+
return hash
229250

230251
/** Formats the given string replacing {x} delimiters with the passed replacements.
231252
Example: "You got {0} gold".format(goldAmount) **/

wurst/_handles/primitives/StringTests.wurst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,10 @@ package StringTests
110110
"dfdf".replace("", "2").assertEquals("dfdf")
111111

112112
@Test function testGetHash()
113-
"test".getHash().assertEquals(StringHash("test"))
113+
// Pre-1.24 has no native StringHash; getHash() is a pure-Wurst hash.
114+
// Verify it is deterministic and distinguishes distinct strings.
115+
"test".getHash().assertEquals("test".getHash())
116+
assertTrue("test".getHash() != "tset".getHash())
114117

115118
@Test function testFormat()
116119
"te{0}".format("s", "t").assertEquals("tes")

wurst/_wurst/ErrorHandling.wurst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Annotations
1111

1212
constant MUTE_ERROR_DURATION = 60
1313
constant PRIMARY_ERROR_KEY = -1
14-
constant HT = InitHashtable()
14+
constant HT = initHashtable()
1515

1616
/**
1717
Stores the last error thrown by error().

wurst/_wurst/TypeCasting.wurst

Lines changed: 4 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -42,177 +42,13 @@ public function playerFromIndex(int index) returns player
4242
public function playerToIndex(player object) returns int
4343
return object.getId()
4444

45-
public function widgetFromIndex(int index) returns widget
46-
typecastdata.saveFogState(0,ConvertFogState(index))
47-
return typecastdata.loadWidget(0)
48-
49-
public function widgetToIndex(widget object) returns int
50-
return object.getHandleId()
51-
52-
public function unitFromIndex(int index) returns unit
53-
typecastdata.saveFogState(0,ConvertFogState(index))
54-
return typecastdata.loadUnit(0)
55-
56-
public function unitToIndex(unit object) returns int
57-
return object.getHandleId()
58-
59-
public function destructableFromIndex(int index) returns destructable
60-
typecastdata.saveFogState(0,ConvertFogState(index))
61-
return typecastdata.loadDestructable(0)
62-
63-
public function destructableToIndex(destructable object) returns int
64-
return object.getHandleId()
65-
66-
public function itemFromIndex(int index) returns item
67-
typecastdata.saveFogState(0,ConvertFogState(index))
68-
return typecastdata.loadItem(0)
69-
70-
public function itemToIndex(item object) returns int
71-
return object.getHandleId()
72-
73-
public function abilityFromIndex(int index) returns ability
74-
typecastdata.saveFogState(0,ConvertFogState(index))
75-
return typecastdata.loadAbility(0)
76-
77-
public function abilityToIndex(ability object) returns int
78-
return object.getHandleId()
79-
80-
public function forceFromIndex(int index) returns force
81-
typecastdata.saveFogState(0,ConvertFogState(index))
82-
return typecastdata.loadForce(0)
83-
84-
public function forceToIndex(force object) returns int
85-
return object.getHandleId()
86-
87-
public function groupFromIndex(int index) returns group
88-
typecastdata.saveFogState(0,ConvertFogState(index))
89-
return typecastdata.loadGroup(0)
90-
91-
public function groupToIndex(group object) returns int
92-
return object.getHandleId()
93-
94-
public function triggerFromIndex(int index) returns trigger
95-
typecastdata.saveFogState(0,ConvertFogState(index))
96-
return typecastdata.loadTrigger(0)
97-
98-
public function triggerToIndex(trigger object) returns int
99-
return object.getHandleId()
100-
101-
public function timerFromIndex(int index) returns timer
102-
typecastdata.saveFogState(0,ConvertFogState(index))
103-
return typecastdata.loadTimer(0)
104-
105-
public function timerToIndex(timer object) returns int
106-
return object.getHandleId()
107-
108-
public function locationFromIndex(int index) returns location
109-
typecastdata.saveFogState(0,ConvertFogState(index))
110-
return typecastdata.loadLocation(0)
111-
112-
public function locationToIndex(location object) returns int
113-
return object.getHandleId()
114-
115-
public function regionFromIndex(int index) returns region
116-
typecastdata.saveFogState(0,ConvertFogState(index))
117-
return typecastdata.loadRegion(0)
118-
119-
public function regionToIndex(region object) returns int
120-
return object.getHandleId()
121-
122-
public function rectFromIndex(int index) returns rect
123-
typecastdata.saveFogState(0,ConvertFogState(index))
124-
return typecastdata.loadRect(0)
125-
126-
public function rectToIndex(rect object) returns int
127-
return object.getHandleId()
128-
129-
public function soundFromIndex(int index) returns sound
130-
typecastdata.saveFogState(0,ConvertFogState(index))
131-
return typecastdata.loadSound(0)
132-
133-
public function soundToIndex(sound object) returns int
134-
return object.getHandleId()
135-
136-
public function effectFromIndex(int index) returns effect
137-
typecastdata.saveFogState(0,ConvertFogState(index))
138-
return typecastdata.loadEffect(0)
139-
140-
public function effectToIndex(effect object) returns int
141-
return object.getHandleId()
142-
143-
public function dialogFromIndex(int index) returns dialog
144-
typecastdata.saveFogState(0,ConvertFogState(index))
145-
return typecastdata.loadDialog(0)
146-
147-
public function dialogToIndex(dialog object) returns int
148-
return object.getHandleId()
149-
150-
public function buttonFromIndex(int index) returns button
151-
typecastdata.saveFogState(0,ConvertFogState(index))
152-
return typecastdata.loadButton(0)
153-
154-
public function buttonToIndex(button object) returns int
155-
return object.getHandleId()
156-
157-
public function questFromIndex(int index) returns quest
158-
typecastdata.saveFogState(0,ConvertFogState(index))
159-
return typecastdata.loadQuest(0)
160-
161-
public function questToIndex(quest object) returns int
162-
return object.getHandleId()
163-
164-
public function questitemFromIndex(int index) returns questitem
165-
typecastdata.saveFogState(0,ConvertFogState(index))
166-
return typecastdata.loadQuestItem(0)
167-
168-
public function questitemToIndex(questitem object) returns int
169-
return object.getHandleId()
170-
171-
public function leaderboardFromIndex(int index) returns leaderboard
172-
typecastdata.saveFogState(0,ConvertFogState(index))
173-
return typecastdata.loadLeaderboard(0)
174-
175-
public function leaderboardToIndex(leaderboard object) returns int
176-
return object.getHandleId()
177-
178-
public function multiboardFromIndex(int index) returns multiboard
179-
typecastdata.saveFogState(0,ConvertFogState(index))
180-
return typecastdata.loadMultiboard(0)
181-
182-
public function multiboardToIndex(multiboard object) returns int
183-
return object.getHandleId()
184-
185-
public function trackableFromIndex(int index) returns trackable
186-
typecastdata.saveFogState(0,ConvertFogState(index))
187-
return typecastdata.loadTrackable(0)
188-
189-
public function trackableToIndex(trackable object) returns int
190-
return object.getHandleId()
191-
192-
public function lightningFromIndex(int index) returns lightning
193-
return typecastdata.loadLightning(index)
194-
195-
public function lightningToIndex(lightning object) returns int
196-
typecastdata.saveLightning(-object.getHandleId(), object)
197-
return -object.getHandleId()
198-
199-
public function imageFromIndex(int index) returns image
200-
typecastdata.saveFogState(0,ConvertFogState(index))
201-
return typecastdata.loadImage(0)
202-
203-
public function imageToIndex(image object) returns int
204-
return object.getHandleId()
205-
206-
public function ubersplatFromIndex(int index) returns ubersplat
207-
typecastdata.saveFogState(0,ConvertFogState(index))
208-
return typecastdata.loadUbersplat(0)
209-
210-
public function ubersplatToIndex(ubersplat object) returns int
211-
return object.getHandleId()
212-
21345
public function booleanToIndex(boolean u) returns int
21446
return u ? 1 : 0
21547

21648
public function booleanFromIndex(int index) returns boolean
21749
return index == 1
21850

51+
// NOTE: Pre-1.24 patches provide neither `GetHandleId` nor the `hashtable`
52+
// native, so there is no way to convert a handle (unit, trigger, effect, ...)
53+
// to an integer and back. All handle-based to/from-index conversions that the
54+
// later-patch stdlib offers are therefore unavailable on this branch.

0 commit comments

Comments
 (0)