autoreplace.cpp
Go to the documentation of this file.00001
00002
00005 #include "stdafx.h"
00006 #include "openttd.h"
00007 #include "debug.h"
00008 #include "command_func.h"
00009 #include "group.h"
00010 #include "autoreplace_base.h"
00011 #include "oldpool_func.h"
00012
00013 DEFINE_OLD_POOL_GENERIC(EngineRenew, EngineRenew)
00014
00015
00018 static EngineRenew *GetEngineReplacement(EngineRenewList erl, EngineID engine, GroupID group)
00019 {
00020 EngineRenew *er = (EngineRenew *)erl;
00021
00022 while (er) {
00023 if (er->from == engine && er->group_id == group) return er;
00024 er = er->next;
00025 }
00026 return NULL;
00027 }
00028
00029 void RemoveAllEngineReplacement(EngineRenewList *erl)
00030 {
00031 EngineRenew *er = (EngineRenew *)(*erl);
00032 EngineRenew *next;
00033
00034 while (er != NULL) {
00035 next = er->next;
00036 delete er;
00037 er = next;
00038 }
00039 *erl = NULL;
00040 }
00041
00042 EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group)
00043 {
00044 const EngineRenew *er = GetEngineReplacement(erl, engine, group);
00045 if (er == NULL && (group == DEFAULT_GROUP || (IsValidGroupID(group) && !GetGroup(group)->replace_protection))) {
00046
00047 er = GetEngineReplacement(erl, engine, ALL_GROUP);
00048 }
00049 return er == NULL ? INVALID_ENGINE : er->to;
00050 }
00051
00052 CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, uint32 flags)
00053 {
00054 EngineRenew *er;
00055
00056
00057 er = GetEngineReplacement(*erl, old_engine, group);
00058 if (er != NULL) {
00059 if (flags & DC_EXEC) er->to = new_engine;
00060 return CommandCost();
00061 }
00062
00063 if (!EngineRenew::CanAllocateItem()) return CMD_ERROR;
00064
00065 if (flags & DC_EXEC) {
00066 er = new EngineRenew(old_engine, new_engine);
00067 er->group_id = group;
00068
00069
00070 er->next = (EngineRenew *)(*erl);
00071 *erl = (EngineRenewList)er;
00072 }
00073
00074 return CommandCost();
00075 }
00076
00077 CommandCost RemoveEngineReplacement(EngineRenewList *erl, EngineID engine, GroupID group, uint32 flags)
00078 {
00079 EngineRenew *er = (EngineRenew *)(*erl);
00080 EngineRenew *prev = NULL;
00081
00082 while (er)
00083 {
00084 if (er->from == engine && er->group_id == group) {
00085 if (flags & DC_EXEC) {
00086 if (prev == NULL) {
00087
00088 *erl = (EngineRenewList)er->next;
00089 } else {
00090
00091 prev->next = er->next;
00092 }
00093 delete er;
00094 }
00095 return CommandCost();
00096 }
00097 prev = er;
00098 er = er->next;
00099 }
00100
00101 return CMD_ERROR;
00102 }
00103
00104 void InitializeEngineRenews()
00105 {
00106
00107 _EngineRenew_pool.CleanPool();
00108 _EngineRenew_pool.AddBlockToPool();
00109 }