19 * served as subject to the initial testing of this codec. */ |
19 * served as subject to the initial testing of this codec. */ |
20 |
20 |
21 extern int _skip_sprites; |
21 extern int _skip_sprites; |
22 extern int _replace_sprites_count[16]; |
22 extern int _replace_sprites_count[16]; |
23 extern int _replace_sprites_offset[16]; |
23 extern int _replace_sprites_offset[16]; |
|
24 extern int _traininfo_vehicle_pitch; |
24 |
25 |
25 struct GRFFile { |
26 struct GRFFile { |
26 char *filename; |
27 char *filename; |
27 uint32 grfid; |
28 uint32 grfid; |
28 uint16 flags; |
29 uint16 flags; |
1546 param_val = 0xFFFF; |
1547 param_val = 0xFFFF; |
1547 break; |
1548 break; |
1548 case 0x8D: /* TTD Version, 00=DOS, 01=Windows */ |
1549 case 0x8D: /* TTD Version, 00=DOS, 01=Windows */ |
1549 param_val = 1; |
1550 param_val = 1; |
1550 break; |
1551 break; |
|
1552 case 0x8E: |
|
1553 param_val = _traininfo_vehicle_pitch; |
|
1554 break; |
1551 /* TODO */ |
1555 /* TODO */ |
1552 case 0x8E: /* How many pixels to displace sprites in train info windows */ |
|
1553 case 0x8F: /* Track type cost multipliers */ |
1556 case 0x8F: /* Track type cost multipliers */ |
1554 default: |
1557 default: |
1555 if (param >= 0x80) { |
1558 if (param >= 0x80) { |
1556 /* In-game variable. */ |
1559 /* In-game variable. */ |
1557 grfmsg(GMS_WARN, "Unsupported in-game variable %x. Ignoring test.", param); |
1560 grfmsg(GMS_WARN, "Unsupported in-game variable %x. Ignoring test.", param); |
1788 |
1792 |
1789 /* TODO: The target operand can also refer to the special variables |
1793 /* TODO: The target operand can also refer to the special variables |
1790 * from action 7, but at the moment the only variable that is valid to |
1794 * from action 7, but at the moment the only variable that is valid to |
1791 * write is 8E. */ |
1795 * write is 8E. */ |
1792 |
1796 |
1793 if (_param_max < target) |
1797 if (target == 0x8E) { |
1794 _param_max = target; |
1798 dest = &_traininfo_vehicle_pitch; |
|
1799 } else { |
|
1800 if (_param_max < target) |
|
1801 _param_max = target; |
|
1802 dest = &_paramlist[target]; |
|
1803 } |
1795 |
1804 |
1796 /* FIXME: No checking for overflows. */ |
1805 /* FIXME: No checking for overflows. */ |
1797 switch (oper) { |
1806 switch (oper) { |
1798 case 0x00: |
1807 case 0x00: |
1799 _paramlist[target] = src1; |
1808 *dest = src1; |
1800 break; |
1809 break; |
1801 case 0x01: |
1810 case 0x01: |
1802 _paramlist[target] = src1 + src2; |
1811 *dest = src1 + src2; |
1803 break; |
1812 break; |
1804 case 0x02: |
1813 case 0x02: |
1805 _paramlist[target] = src1 - src2; |
1814 *dest = src1 - src2; |
1806 break; |
1815 break; |
1807 case 0x03: |
1816 case 0x03: |
1808 _paramlist[target] = ((uint32) src1) * ((uint32) src2); |
1817 *dest = ((uint32) src1) * ((uint32) src2); |
1809 break; |
1818 break; |
1810 case 0x04: |
1819 case 0x04: |
1811 _paramlist[target] = ((int32) src1) * ((int32) src2); |
1820 *dest = ((int32) src1) * ((int32) src2); |
1812 break; |
1821 break; |
1813 case 0x05: |
1822 case 0x05: |
1814 if (src2 & 0x8000) /* src2 is "negative" */ |
1823 if (src2 & 0x8000) /* src2 is "negative" */ |
1815 _paramlist[target] = src1 >> -((int16) src2); |
1824 *dest = src1 >> -((int16) src2); |
1816 else |
1825 else |
1817 _paramlist[target] = src1 << src2; |
1826 *dest = src1 << src2; |
1818 break; |
1827 break; |
1819 case 0x06: |
1828 case 0x06: |
1820 if (src2 & 0x8000) /* src2 is "negative" */ |
1829 if (src2 & 0x8000) /* src2 is "negative" */ |
1821 _paramlist[target] = ((int16) src1) >> -((int16) src2); |
1830 *dest = ((int16) src1) >> -((int16) src2); |
1822 else |
1831 else |
1823 _paramlist[target] = ((int16) src1) << src2; |
1832 *dest = ((int16) src1) << src2; |
1824 break; |
1833 break; |
1825 default: |
1834 default: |
1826 grfmsg(GMS_ERROR, "ParamSet: Unknown operation %d, skipping.", oper); |
1835 grfmsg(GMS_ERROR, "ParamSet: Unknown operation %d, skipping.", oper); |
1827 } |
1836 } |
1828 } |
1837 } |