|
2 | 2 | #ifndef JS_CALLBACK_H |
3 | 3 | #define JS_CALLBACK_H |
4 | 4 |
|
| 5 | +#include <cstdint> |
5 | 6 | #include <emscripten/val.h> |
6 | 7 | #include "callback.h" |
7 | 8 |
|
| 9 | +inline emscripten::val micropolisPointerValue(Micropolis *micropolis) { |
| 10 | + return emscripten::val(reinterpret_cast<uintptr_t>(micropolis)); |
| 11 | +} |
| 12 | + |
8 | 13 | class JSCallback : public Callback { |
9 | 14 | public: |
10 | 15 | explicit JSCallback(emscripten::val jsCallback) |
11 | 16 | : Callback(), jsCallback(jsCallback) {} |
12 | 17 |
|
13 | 18 | // Implement all pure virtual functions from Callback |
14 | 19 | void autoGoto(Micropolis *micropolis, emscripten::val callbackVal, int x, int y, std::string message) override { |
15 | | - jsCallback.call<void>("autoGoto", emscripten::val(micropolis), callbackVal, x, y, message); |
| 20 | + jsCallback.call<void>("autoGoto", micropolisPointerValue(micropolis), callbackVal, x, y, message); |
16 | 21 | } |
17 | 22 |
|
18 | 23 | void didGenerateMap(Micropolis *micropolis, emscripten::val callbackVal, int seed) override { |
19 | | - jsCallback.call<void>("didGenerateMap", emscripten::val(micropolis), callbackVal, seed); |
| 24 | + jsCallback.call<void>("didGenerateMap", micropolisPointerValue(micropolis), callbackVal, seed); |
20 | 25 | } |
21 | 26 |
|
22 | 27 | void didLoadCity(Micropolis *micropolis, emscripten::val callbackVal, std::string filename) override { |
23 | | - jsCallback.call<void>("didLoadCity", emscripten::val(micropolis), callbackVal, filename); |
| 28 | + jsCallback.call<void>("didLoadCity", micropolisPointerValue(micropolis), callbackVal, filename); |
24 | 29 | } |
25 | 30 |
|
26 | 31 | void didLoadScenario(Micropolis *micropolis, emscripten::val callbackVals, std::string name, std::string fname) override { |
27 | | - jsCallback.call<void>("didLoadScenario", emscripten::val(micropolis), callbackVals, name, fname); |
| 32 | + jsCallback.call<void>("didLoadScenario", micropolisPointerValue(micropolis), callbackVals, name, fname); |
28 | 33 | } |
29 | 34 |
|
30 | 35 | void didLoseGame(Micropolis *micropolis, emscripten::val callbackVal) override { |
31 | | - jsCallback.call<void>("didLoseGame", emscripten::val(micropolis), callbackVal); |
| 36 | + jsCallback.call<void>("didLoseGame", micropolisPointerValue(micropolis), callbackVal); |
32 | 37 | } |
33 | 38 |
|
34 | 39 | void didSaveCity(Micropolis *micropolis, emscripten::val callbackVal, std::string filename) override { |
35 | | - jsCallback.call<void>("didSaveCity", emscripten::val(micropolis), callbackVal, filename); |
| 40 | + jsCallback.call<void>("didSaveCity", micropolisPointerValue(micropolis), callbackVal, filename); |
36 | 41 | } |
37 | 42 |
|
38 | 43 | void didTool(Micropolis *micropolis, emscripten::val callbackVal, std::string name, int x, int y) override { |
39 | | - jsCallback.call<void>("didTool", emscripten::val(micropolis), callbackVal, name, x, y); |
| 44 | + jsCallback.call<void>("didTool", micropolisPointerValue(micropolis), callbackVal, name, x, y); |
40 | 45 | } |
41 | 46 |
|
42 | 47 | void didWinGame(Micropolis *micropolis, emscripten::val callbackVal) override { |
43 | | - jsCallback.call<void>("didWinGame", emscripten::val(micropolis), callbackVal); |
| 48 | + jsCallback.call<void>("didWinGame", micropolisPointerValue(micropolis), callbackVal); |
44 | 49 | } |
45 | 50 |
|
46 | 51 | void didntLoadCity(Micropolis *micropolis, emscripten::val callbackVal, std::string filename) override { |
47 | | - jsCallback.call<void>("didntLoadCity", emscripten::val(micropolis), callbackVal, filename); |
| 52 | + jsCallback.call<void>("didntLoadCity", micropolisPointerValue(micropolis), callbackVal, filename); |
48 | 53 | } |
49 | 54 |
|
50 | 55 | void didntSaveCity(Micropolis *micropolis, emscripten::val callbackVal, std::string filename) override { |
51 | | - jsCallback.call<void>("didntSaveCity", emscripten::val(micropolis), callbackVal, filename); |
| 56 | + jsCallback.call<void>("didntSaveCity", micropolisPointerValue(micropolis), callbackVal, filename); |
52 | 57 | } |
53 | 58 |
|
54 | 59 | void makeSound(Micropolis *micropolis, emscripten::val callbackVal, std::string channel, std::string sound, int x, int y) override { |
55 | | - jsCallback.call<void>("makeSound", emscripten::val(micropolis), callbackVal, channel, sound, x, y); |
| 60 | + jsCallback.call<void>("makeSound", micropolisPointerValue(micropolis), callbackVal, channel, sound, x, y); |
56 | 61 | } |
57 | 62 |
|
58 | 63 | void newGame(Micropolis *micropolis, emscripten::val callbackVal) override { |
59 | | - jsCallback.call<void>("newGame", emscripten::val(micropolis), callbackVal); |
| 64 | + jsCallback.call<void>("newGame", micropolisPointerValue(micropolis), callbackVal); |
60 | 65 | } |
61 | 66 |
|
62 | 67 | void saveCityAs(Micropolis *micropolis, emscripten::val callbackVal, std::string filename) override { |
63 | | - jsCallback.call<void>("saveCityAs", emscripten::val(micropolis), callbackVal, filename); |
| 68 | + jsCallback.call<void>("saveCityAs", micropolisPointerValue(micropolis), callbackVal, filename); |
64 | 69 | } |
65 | 70 |
|
66 | 71 | void sendMessage(Micropolis *micropolis, emscripten::val callbackVal, int messageIndex, int x, int y, bool picture, bool important) override { |
67 | | - jsCallback.call<void>("sendMessage", emscripten::val(micropolis), callbackVal, messageIndex, x, y, picture, important); |
| 72 | + jsCallback.call<void>("sendMessage", micropolisPointerValue(micropolis), callbackVal, messageIndex, x, y, picture, important); |
68 | 73 | } |
69 | 74 |
|
70 | 75 | void showBudgetAndWait(Micropolis *micropolis, emscripten::val callbackVal) override { |
71 | | - jsCallback.call<void>("showBudgetAndWait", emscripten::val(micropolis), callbackVal); |
| 76 | + jsCallback.call<void>("showBudgetAndWait", micropolisPointerValue(micropolis), callbackVal); |
72 | 77 | } |
73 | 78 |
|
74 | 79 | void showZoneStatus(Micropolis *micropolis, emscripten::val callbackVal, int tileCategoryIndex, int populationDensityIndex, int landValueIndex, int crimeRateIndex, int pollutionIndex, int growthRateIndex, int x, int y) override { |
75 | | - jsCallback.call<void>("showZoneStatus", emscripten::val(micropolis), callbackVal, tileCategoryIndex, populationDensityIndex, landValueIndex, crimeRateIndex, pollutionIndex, growthRateIndex, x, y); |
| 80 | + jsCallback.call<void>("showZoneStatus", micropolisPointerValue(micropolis), callbackVal, tileCategoryIndex, populationDensityIndex, landValueIndex, crimeRateIndex, pollutionIndex, growthRateIndex, x, y); |
76 | 81 | } |
77 | 82 |
|
78 | 83 | void simulateRobots(Micropolis *micropolis, emscripten::val callbackVal) override { |
79 | | - jsCallback.call<void>("simulateRobots", emscripten::val(micropolis), callbackVal); |
| 84 | + jsCallback.call<void>("simulateRobots", micropolisPointerValue(micropolis), callbackVal); |
80 | 85 | } |
81 | 86 |
|
82 | 87 | void simulateChurch(Micropolis *micropolis, emscripten::val callbackVal, int posX, int posY, int churchNumber) override { |
83 | | - jsCallback.call<void>("simulateChurch", emscripten::val(micropolis), callbackVal, posX, posY, churchNumber); |
| 88 | + jsCallback.call<void>("simulateChurch", micropolisPointerValue(micropolis), callbackVal, posX, posY, churchNumber); |
84 | 89 | } |
85 | 90 |
|
86 | 91 | void startEarthquake(Micropolis *micropolis, emscripten::val callbackVal, int strength) override { |
87 | | - jsCallback.call<void>("startEarthquake", emscripten::val(micropolis), callbackVal, strength); |
| 92 | + jsCallback.call<void>("startEarthquake", micropolisPointerValue(micropolis), callbackVal, strength); |
88 | 93 | } |
89 | 94 |
|
90 | 95 | void startGame(Micropolis *micropolis, emscripten::val callbackVal) override { |
91 | | - jsCallback.call<void>("startGame", emscripten::val(micropolis), callbackVal); |
| 96 | + jsCallback.call<void>("startGame", micropolisPointerValue(micropolis), callbackVal); |
92 | 97 | } |
93 | 98 |
|
94 | 99 | void startScenario(Micropolis *micropolis, emscripten::val callbackVal, int scenario) override { |
95 | | - jsCallback.call<void>("startScenario", emscripten::val(micropolis), callbackVal, scenario); |
| 100 | + jsCallback.call<void>("startScenario", micropolisPointerValue(micropolis), callbackVal, scenario); |
96 | 101 | } |
97 | 102 |
|
98 | 103 | void updateBudget(Micropolis *micropolis, emscripten::val callbackVal) override { |
99 | | - jsCallback.call<void>("updateBudget", emscripten::val(micropolis), callbackVal); |
| 104 | + jsCallback.call<void>("updateBudget", micropolisPointerValue(micropolis), callbackVal); |
100 | 105 | } |
101 | 106 |
|
102 | 107 | void updateCityName(Micropolis *micropolis, emscripten::val callbackVal, std::string cityName) override { |
103 | | - jsCallback.call<void>("updateCityName", emscripten::val(micropolis), callbackVal, cityName); |
| 108 | + jsCallback.call<void>("updateCityName", micropolisPointerValue(micropolis), callbackVal, cityName); |
104 | 109 | } |
105 | 110 |
|
106 | 111 | void updateDate(Micropolis *micropolis, emscripten::val callbackVal, int cityYear, int cityMonth) override { |
107 | | - jsCallback.call<void>("updateDate", emscripten::val(micropolis), callbackVal, cityYear, cityMonth); |
| 112 | + jsCallback.call<void>("updateDate", micropolisPointerValue(micropolis), callbackVal, cityYear, cityMonth); |
108 | 113 | } |
109 | 114 |
|
110 | 115 | void updateDemand(Micropolis *micropolis, emscripten::val callbackVal, float r, float c, float i) override { |
111 | | - jsCallback.call<void>("updateDemand", emscripten::val(micropolis), callbackVal, r, c, i); |
| 116 | + jsCallback.call<void>("updateDemand", micropolisPointerValue(micropolis), callbackVal, r, c, i); |
112 | 117 | } |
113 | 118 |
|
114 | 119 | void updateEvaluation(Micropolis *micropolis, emscripten::val callbackVal) override { |
115 | | - jsCallback.call<void>("updateEvaluation", emscripten::val(micropolis), callbackVal); |
| 120 | + jsCallback.call<void>("updateEvaluation", micropolisPointerValue(micropolis), callbackVal); |
116 | 121 | } |
117 | 122 |
|
118 | 123 | void updateFunds(Micropolis *micropolis, emscripten::val callbackVal, int totalFunds) override { |
119 | | - jsCallback.call<void>("updateFunds", emscripten::val(micropolis), callbackVal, totalFunds); |
| 124 | + jsCallback.call<void>("updateFunds", micropolisPointerValue(micropolis), callbackVal, totalFunds); |
120 | 125 | } |
121 | 126 |
|
122 | 127 | void updateGameLevel(Micropolis *micropolis, emscripten::val callbackVal, int gameLevel) override { |
123 | | - jsCallback.call<void>("updateGameLevel", emscripten::val(micropolis), callbackVal, gameLevel); |
| 128 | + jsCallback.call<void>("updateGameLevel", micropolisPointerValue(micropolis), callbackVal, gameLevel); |
124 | 129 | } |
125 | 130 |
|
126 | 131 | void updateHistory(Micropolis *micropolis, emscripten::val callbackVal) override { |
127 | | - jsCallback.call<void>("updateHistory", emscripten::val(micropolis), callbackVal); |
| 132 | + jsCallback.call<void>("updateHistory", micropolisPointerValue(micropolis), callbackVal); |
128 | 133 | } |
129 | 134 |
|
130 | 135 | void updateMap(Micropolis *micropolis, emscripten::val callbackVal) override { |
131 | | - jsCallback.call<void>("updateMap", emscripten::val(micropolis), callbackVal); |
| 136 | + jsCallback.call<void>("updateMap", micropolisPointerValue(micropolis), callbackVal); |
132 | 137 | } |
133 | 138 |
|
134 | 139 | void updateOptions(Micropolis *micropolis, emscripten::val callbackVal) override { |
135 | | - jsCallback.call<void>("updateOptions", emscripten::val(micropolis), callbackVal); |
| 140 | + jsCallback.call<void>("updateOptions", micropolisPointerValue(micropolis), callbackVal); |
136 | 141 | } |
137 | 142 |
|
138 | 143 | void updatePasses(Micropolis *micropolis, emscripten::val callbackVal, int passes) override { |
139 | | - jsCallback.call<void>("updatePasses", emscripten::val(micropolis), callbackVal, passes); |
| 144 | + jsCallback.call<void>("updatePasses", micropolisPointerValue(micropolis), callbackVal, passes); |
140 | 145 | } |
141 | 146 |
|
142 | 147 | void updatePaused(Micropolis *micropolis, emscripten::val callbackVal, bool simPaused) override { |
143 | | - jsCallback.call<void>("updatePaused", emscripten::val(micropolis), callbackVal, simPaused); |
| 148 | + jsCallback.call<void>("updatePaused", micropolisPointerValue(micropolis), callbackVal, simPaused); |
144 | 149 | } |
145 | 150 |
|
146 | 151 | void updateSpeed(Micropolis *micropolis, emscripten::val callbackVal, int speed) override { |
147 | | - jsCallback.call<void>("updateSpeed", emscripten::val(micropolis), callbackVal, speed); |
| 152 | + jsCallback.call<void>("updateSpeed", micropolisPointerValue(micropolis), callbackVal, speed); |
148 | 153 | } |
149 | 154 |
|
150 | 155 | void updateTaxRate(Micropolis *micropolis, emscripten::val callbackVal, int cityTax) override { |
151 | | - jsCallback.call<void>("updateTaxRate", emscripten::val(micropolis), callbackVal, cityTax); |
| 156 | + jsCallback.call<void>("updateTaxRate", micropolisPointerValue(micropolis), callbackVal, cityTax); |
152 | 157 | } |
153 | 158 |
|
154 | 159 | private: |
|
0 commit comments