grfspecial.c
changeset 420 d4aa4a1df3c6
parent 419 d5481f341ab7
child 438 f80cc59e69c2
equal deleted inserted replaced
419:d5481f341ab7 420:d4aa4a1df3c6
    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);
  1737 	byte target;
  1740 	byte target;
  1738 	byte oper;
  1741 	byte oper;
  1739 	uint16 src1;
  1742 	uint16 src1;
  1740 	uint16 src2;
  1743 	uint16 src2;
  1741 	uint16 data = 0;
  1744 	uint16 data = 0;
       
  1745 	int32 *dest;
  1742 
  1746 
  1743 	check_length(len, 5, "ParamSet");
  1747 	check_length(len, 5, "ParamSet");
  1744 	buf++;
  1748 	buf++;
  1745 	target = grf_load_byte(&buf);
  1749 	target = grf_load_byte(&buf);
  1746 	oper = grf_load_byte(&buf);
  1750 	oper = grf_load_byte(&buf);
  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 }