| 1708 | } |
| 1709 | |
| 1710 | static bool SlObjectMember(void *object, const SaveLoad &sld) |
| 1711 | { |
| 1712 | if (!SlIsObjectValidInSavegame(sld)) return false; |
| 1713 | |
| 1714 | VarType conv = GB(sld.conv, 0, 8); |
| 1715 | switch (sld.cmd) { |
| 1716 | case SL_VAR: |
| 1717 | case SL_REF: |
| 1718 | case SL_ARR: |
| 1719 | case SL_REFLIST: |
| 1720 | case SL_REFVECTOR: |
| 1721 | case SL_DEQUE: |
| 1722 | case SL_VECTOR: |
| 1723 | case SL_STDSTR: { |
| 1724 | void *ptr = GetVariableAddress(object, sld); |
| 1725 | |
| 1726 | switch (sld.cmd) { |
| 1727 | case SL_VAR: SlSaveLoadConv(ptr, conv); break; |
| 1728 | case SL_REF: SlSaveLoadRef(ptr, conv); break; |
| 1729 | case SL_ARR: SlArray(ptr, sld.length, conv); break; |
| 1730 | case SL_REFLIST: SlRefList(ptr, conv); break; |
| 1731 | case SL_REFVECTOR: SlRefVector(ptr, conv); break; |
| 1732 | case SL_DEQUE: SlDeque(ptr, conv); break; |
| 1733 | case SL_VECTOR: SlVector(ptr, conv); break; |
| 1734 | case SL_STDSTR: SlStdString(ptr, sld.conv); break; |
| 1735 | default: NOT_REACHED(); |
| 1736 | } |
| 1737 | break; |
| 1738 | } |
| 1739 | |
| 1740 | /* SL_SAVEBYTE writes a value to the savegame to identify the type of an object. |
| 1741 | * When loading, the value is read explicitly with SlReadByte() to determine which |
| 1742 | * object description to use. */ |
| 1743 | case SL_SAVEBYTE: { |
| 1744 | void *ptr = GetVariableAddress(object, sld); |
| 1745 | |
| 1746 | switch (_sl.action) { |
| 1747 | case SLA_SAVE: SlWriteByte(*(uint8_t *)ptr); break; |
| 1748 | case SLA_LOAD_CHECK: |
| 1749 | case SLA_LOAD: |
| 1750 | case SLA_PTRS: |
| 1751 | case SLA_NULL: break; |
| 1752 | default: NOT_REACHED(); |
| 1753 | } |
| 1754 | break; |
| 1755 | } |
| 1756 | |
| 1757 | case SL_NULL: { |
| 1758 | assert(GetVarMemType(sld.conv) == SLE_VAR_NULL); |
| 1759 | |
| 1760 | switch (_sl.action) { |
| 1761 | case SLA_LOAD_CHECK: |
| 1762 | case SLA_LOAD: SlSkipBytes(SlCalcConvFileLen(sld.conv) * sld.length); break; |
| 1763 | case SLA_SAVE: for (int i = 0; i < SlCalcConvFileLen(sld.conv) * sld.length; i++) SlWriteByte(0); break; |
| 1764 | case SLA_PTRS: |
| 1765 | case SLA_NULL: break; |
| 1766 | default: NOT_REACHED(); |
| 1767 | } |
no test coverage detected