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