| | 1 | /* |
| | 2 | * test of save/restore |
| | 3 | */ |
| | 4 | |
| | 5 | #include "tads.h" |
| | 6 | #include "t3.h" |
| | 7 | |
| | 8 | class RuntimeError: object |
| | 9 | construct(errno, ...) { errno_ = errno; } |
| | 10 | display = "Runtime Error: <<errno_>>" |
| | 11 | errno_ = 0 |
| | 12 | ; |
| | 13 | |
| | 14 | _say_embed(str) { tadsSay(str); } |
| | 15 | |
| | 16 | _main(args) |
| | 17 | { |
| | 18 | try |
| | 19 | { |
| | 20 | t3SetSay(_say_embed); |
| | 21 | main(args); |
| | 22 | } |
| | 23 | catch (RuntimeError rte) |
| | 24 | { |
| | 25 | "\n<<rte.display>>\n"; |
| | 26 | } |
| | 27 | } |
| | 28 | |
| | 29 | obj1: object |
| | 30 | construct(nm) { sdesc = nm; } |
| | 31 | p1 = 'original obj1.p1' |
| | 32 | p2 = 'original obj1.p2' |
| | 33 | p3 = nil |
| | 34 | p4 = 'original obj1.p4' |
| | 35 | sdesc = 'obj1' |
| | 36 | ; |
| | 37 | |
| | 38 | obj2: object |
| | 39 | construct(nm) { sdesc = nm; } |
| | 40 | p1 = 'original obj2.p1' |
| | 41 | p2 = 'original obj2.p2' |
| | 42 | p3 = nil |
| | 43 | p4 = 'original obj2.p4' |
| | 44 | sdesc = 'obj1' |
| | 45 | ; |
| | 46 | |
| | 47 | globals: object |
| | 48 | obj3_ = nil |
| | 49 | ; |
| | 50 | |
| | 51 | main(args) |
| | 52 | { |
| | 53 | local obj3; |
| | 54 | |
| | 55 | obj3 = new obj1('obj3 pre-save'); |
| | 56 | obj3.p1 = obj3.p2 = 'first new obj3'; |
| | 57 | obj3.p1 += '.p1'; |
| | 58 | obj3.p2 += '.p2'; |
| | 59 | |
| | 60 | obj1.p1 += ' Modified!'; |
| | 61 | obj2.p2 += ' Modified!'; |
| | 62 | |
| | 63 | obj1.p3 = obj2.p3 = obj3; |
| | 64 | |
| | 65 | |
| | 66 | "Pre-save:\n"; |
| | 67 | "obj1.p1 = <<obj1.p1>>, p2 = <<obj1.p2>>, p3 = <<obj1.p3.sdesc>>\n"; |
| | 68 | "obj2.p1 = <<obj2.p1>>, p2 = <<obj2.p2>>, p3 = <<obj2.p3.sdesc>>\n"; |
| | 69 | "obj3.p1 = <<obj3.p1>>, p2 = <<obj3.p2>>, p4 = <<obj3.p4>>\n"; |
| | 70 | "\b"; |
| | 71 | |
| | 72 | "Saving...\n"; |
| | 73 | globals.obj3_ = obj3; |
| | 74 | saveGame('test.t3v'); |
| | 75 | "Saved!\n"; |
| | 76 | |
| | 77 | obj3 = new obj2('obj3 post-save'); |
| | 78 | obj3.p1 = obj3.p2 = 'second new obj3'; |
| | 79 | obj3.p1 += '.p1'; |
| | 80 | obj3.p2 += '.p2'; |
| | 81 | |
| | 82 | obj1.p1 += ' Mod Post Save'; |
| | 83 | obj1.p2 += ' Mod Post Save'; |
| | 84 | obj2.p1 += ' Mod Post Save'; |
| | 85 | obj2.p2 += ' Mod Post Save'; |
| | 86 | |
| | 87 | obj1.p3 = obj2.p3 = obj3; |
| | 88 | |
| | 89 | "Pre-Restore:\n"; |
| | 90 | "obj1.p1 = <<obj1.p1>>, p2 = <<obj1.p2>>, p3 = <<obj1.p3.sdesc>>\n"; |
| | 91 | "obj2.p1 = <<obj2.p1>>, p2 = <<obj2.p2>>, p3 = <<obj2.p3.sdesc>>\n"; |
| | 92 | "obj3.p1 = <<obj3.p1>>, p2 = <<obj3.p2>>, p4 = <<obj3.p4>>\n"; |
| | 93 | "\b"; |
| | 94 | |
| | 95 | "Restoring...\n"; |
| | 96 | restoreGame('test.t3v'); |
| | 97 | obj3 = globals.obj3_; |
| | 98 | "Restored!\n"; |
| | 99 | |
| | 100 | "Post-Restore:\n"; |
| | 101 | "obj1.p1 = <<obj1.p1>>, p2 = <<obj1.p2>>, p3 = <<obj1.p3.sdesc>>\n"; |
| | 102 | "obj2.p1 = <<obj2.p1>>, p2 = <<obj2.p2>>, p3 = <<obj2.p3.sdesc>>\n"; |
| | 103 | "obj3.p1 = <<obj3.p1>>, p2 = <<obj3.p2>>, p4 = <<obj3.p4>>\n"; |
| | 104 | "\b"; |
| | 105 | |
| | 106 | "Restarting...\n"; |
| | 107 | restartGame(); |
| | 108 | _reinit(789, args); |
| | 109 | } |
| | 110 | |
| | 111 | _reinit(ctx, args) |
| | 112 | { |
| | 113 | try |
| | 114 | { |
| | 115 | t3SetSay(_say_embed); |
| | 116 | reinit(ctx); |
| | 117 | } |
| | 118 | catch (RuntimeError rte) |
| | 119 | { |
| | 120 | "\n<<rte.display>>\n"; |
| | 121 | } |
| | 122 | } |
| | 123 | |
| | 124 | reinit(ctx) |
| | 125 | { |
| | 126 | "This is reinit! ctx = <<ctx>>\n"; |
| | 127 | |
| | 128 | obj1.p3 = obj2.p3 = new obj1('obj3 in reinit'); |
| | 129 | "obj1.p1 = <<obj1.p1>>, p2 = <<obj1.p2>>, p3 = <<obj1.p3.sdesc>>\n"; |
| | 130 | "obj2.p1 = <<obj2.p1>>, p2 = <<obj2.p2>>, p3 = <<obj2.p3.sdesc>>\n"; |
| | 131 | "\b"; |
| | 132 | |
| | 133 | "Calling test1...\n"; |
| | 134 | test1(); |
| | 135 | "Back in reinit\n"; |
| | 136 | |
| | 137 | "Restoring...\n"; |
| | 138 | restoreGame('test.t3v'); |
| | 139 | "Restored!\n"; |
| | 140 | |
| | 141 | "obj1.p1 = <<obj1.p1>>, p2 = <<obj1.p2>>, p3 = <<obj1.p3.sdesc>>\n"; |
| | 142 | "obj2.p1 = <<obj2.p1>>, p2 = <<obj2.p2>>, p3 = <<obj2.p3.sdesc>>\n"; |
| | 143 | "\b"; |
| | 144 | } |
| | 145 | |
| | 146 | test1() |
| | 147 | { |
| | 148 | local x; |
| | 149 | |
| | 150 | x = 'hello'; |
| | 151 | x += ' '; |
| | 152 | x += 'there!'; |
| | 153 | |
| | 154 | "In test1 - x = '<<x>>'; calling test2...\n"; |
| | 155 | test2(); |
| | 156 | "Back in test1 - x = '<<x>>'\n"; |
| | 157 | } |
| | 158 | |
| | 159 | test2() |
| | 160 | { |
| | 161 | "In test2\n"; |
| | 162 | |
| | 163 | obj1.p2 += ' test2-modified'; |
| | 164 | obj2.p1 += ' test2-modified'; |
| | 165 | "obj1.p1 = <<obj1.p1>>, p2 = <<obj1.p2>>, p3 = <<obj1.p3.sdesc>>\n"; |
| | 166 | "obj2.p1 = <<obj2.p1>>, p2 = <<obj2.p2>>, p3 = <<obj2.p3.sdesc>>\n"; |
| | 167 | "\b"; |
| | 168 | |
| | 169 | "Saving...\n"; |
| | 170 | saveGame('test.t3v'); |
| | 171 | "Saved.\n"; |
| | 172 | |
| | 173 | obj1.p1 += ' post-save-test2-modified'; |
| | 174 | obj2.p2 += ' post-save-test2-modified'; |
| | 175 | |
| | 176 | "obj1.p1 = <<obj1.p1>>, p2 = <<obj1.p2>>, p3 = <<obj1.p3.sdesc>>\n"; |
| | 177 | "obj2.p1 = <<obj2.p1>>, p2 = <<obj2.p2>>, p3 = <<obj2.p3.sdesc>>\n"; |
| | 178 | "\b"; |
| | 179 | } |
| | 180 | |