ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Кодинг в обже, вопросы и ответы | страница 1 |
|
|
|
Канал X3: Reunion »
Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы» |
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Тема создана именно для обмена опытом по внутренностям Х3. Точнее - обжи и возможно ехе.
Для обсуждения новых команд скрипт-редактора - есть отдельная тема Добавляем новые команды в скрипт редактор .
Для модификации - Армагеддон - тоже .
Пока не предусматривается обсуждать в этой теме - переделки обжей. Только обмен опытом. Очень многие данные о логике работы игры были вытащены из ее внутренностей .
Значить так - как получить читаемый текст обжа:
- Достаем последний обж - из 09.cat/dat, из папки L, имя файла - x3story.obj.
- Идем в тему X2-ASM - это проcто!, и качаем дизассемблер, ну и на всякий случай - ассемблер.
- Меняем значение в dobj.ini, с OutFmt = HEX на OutFmt = DEC. Так же предлагаю заменить секцию [Class_X3], на предложенный мною вариант именования классов игровых объектов.
- Запускаем dobj.exe x3story.obj.
- На этом знатоки ассемблера могут остановиться и читать полученный ассемблерный код.
Замечание: Если файл x3story.err состоит только из записей вида "Error: Overflow stack at command addr = 00005670; stack = 1 limit = 0", то это нормально
- Далее идем в тему Трансляторы XC->XASM и XASM->XC, и качаем файлы xa2c.rar и xc.rar, последних версий.
- Запускаем xa2c.exe x3story addx3.txt. В результате получаем файл x3story.cpp
Замечание, для версии 2.5 надо добавить в addx3.txt, следующие строки:
Код: |
.extern GetStandardTurretLaserMask, GetSpecialTurretLaserMask
.extern GetStandardMissileMask, GetSpecialMissileMask
.extern SetCurrentMissileType, GetNumMissiles
.extern SetPilotTradeSkill, GetPilotTradeSkill
|
Я в них не совсем уверен, потому экспериментируйте лучше с версией 2.0.02.
- Можно приступать к гаданию на внутренностях Х3.
Если вы таки хотите что-то подправить в полученном коде, и сделать обж, и поиграть с ним , то
- На полученный x3story.cpp напускаете xc.exe, т.е. выполняете xc.exe x3story.cpp (в папке с ними должен находиться x3story.h), предварительно исправив параметр с GenerateEnd = 0 на GenerateEnd = 1.
- Потом подправляете секцию [Class_X3] в файле xa_asm.ini, аналогично сделанному в dobj.ini. Так же исправляем с TypeName = HEX на TypeName = DEC
- потом на полученный x3story.inc напускаем xa_asm.exe, т.е. выполняем xa_asm.exe x3story.inc. И если нет ошибок, то переименовываем x3story.cod в x3story.obj.
- Запаковываем x3story.obj в новый .cat/.dat и пробуем загрузиться с ним
Предупреждение: Описание части функций вида XX_YYYYY, существующих вне обжа может быть получено на сайте Эгософта. Однако для этого надо зарегистрироваться на их сайте и согласиться с некими условиями. Потому здесь прямая отсылка на эту информацию не публикуется.
Здесь мы делимся только тем, что смогли "раскопать" сами.
З.Ы. Немного обновил текст в следующем посте. Плюс собрал сопуствующие файлики конфигурации в один файл.
З.Ы.Ы. С этими файлами разобрал - собрал без ошибок.
obj2xc-conf.7z |
Описание: |
x3story_obj_to_cpp.cmd - запуск разборки dobj.ini - конфигурация для дизассемблера addx3_25.txt - добавочный файл для 2.5 |
|
Имя файла: |
obj2xc-conf.7z |
Размер файла: |
5.17 KB |
Скачано: |
1035 раз(а) |
xc2obj-conf.7z |
Описание: |
x3story_cpp_to_obj.cmd - запуск сборки xa_asm.ini - конфигурация для ассемблера xc.ini - для xc |
|
Имя файла: |
xc2obj-conf.7z |
Размер файла: |
6.27 KB |
Скачано: |
1037 раз(а) |
_________________ Умножим энтропию на 0 :-)
Последний раз редактировалось: Gannibal (21:18 27-04-2011), всего редактировалось 1 раз Последний раз редактировалось: Chem (17:47 03-04-2008), всего редактировалось 10 раз(а) |
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Предлагаемая структура секции Class_X3 для файла dobj.ini. X3store.obj - из версии 2.5 (или 2.0.02, т.к. описание лишнего количества типов данніх никому не вредит.
Код класса | Идентификатор класса | Родительский класс | Описание класса | 1 | TX_AUDIO | | | 2 | TINIT | | | 2000 | TGALAXY | | | 2001 | TSECTOR | | | 2002 | TPLANET | | | 2003 | TRACE | TRACEBASE | | 2004 | TSHIP | TSCRIPT | | 2005 | TRACEBASE | | | 2006 | TFACTORY | TSTATION | | 2007 | TDOCK | TSTATION | | 2008 | TSUN | | | 2009 | TPLAYER | | | 2010 | TCUSTOM_GALOBJ | TGBODY | | 2011 | TLASERTOWER | TSHIP_STATIONARY | | 2012 | TASTEROID | TGBODY | | 2014 | TGATE | TGBODY | | 2015 | TPIRATES | TRACE | | 2016 | TSTATION | TSCRIPT | | 2017 | TGONER | TRACE | | 2018 | TSPECIAL | TGBODY | | 2019 | TSHIP_HUGE | TSHIP_CARRIER | | 2021 | TSHIP_M1 | TSHIP_HUGE | | 2022 | TSHIP_M2 | TSHIP_HUGE | | 2023 | TSHIP_M3 | TSHIP_FIGHTER | | 2024 | TSHIP_M4 | TSHIP_FIGHTER | | 2025 | TSHIP_M5 | TSHIP_FIGHTER | | 2026 | TSHIP_M6 | TSHIP_CARRIER | | 2027 | TSHIP_M7 | TSHIP_CARRIER | | 2030 | TSHIP_TP | TSHIP_TS | | 2031 | TSHIP_TS | TSHIP_LITTLE | | 2032 | TSHIP_TL | TSHIP_HUGE | | 2033 | TSHIP_CARRIER | TSHIP_BIG | | 2034 | TSHIP_FIGHTER | TSHIP_LITTLE | | 2035 | TSHIP_TS_PIRATE | TSHIP_TS | | 2037 | TSHIPYARD | TFACTORY | | 2038 | TSHIP_SPEAKER | TSHIP | | 2039 | TSHIP_GONER | TSHIP_LITTLE | | 2042 | TDOCK_GONER | TDOCK | | 2043 | TNEBULA | | | 2044 | TCOMPLEX | TFACTORY | | 2045 | TCOMPLEX_HQ | TCOMPLEX | | 2046 | THEAD_QUARTER | TDOCK | | 2050 | TGBODY | | | 2060 | TBEACON | TSATELLITECLASS | | 2061 | TDRONE_BASE_CLASS | TSHIP_LITTLE | | 2064 | TSHIP_ASTRONAUT | TSHIP_SPECIAL | | 2065 | TSATELLITE | TSATELLITECLASS | | 2066 | TMINE | TSHIP_STATIONARY | | 2067 | TFIGHTDRONE | TDRONE_BASE_CLASS | | 2068 | TSHIP_UFO | TSHIP_SPECIAL | | 2069 | TGLOBAL_SCRIPT_MAP | | | 2070 | TSPACEFLY | TSHIP_SPECIAL | | 2071 | TREBUILD | | | 2072 | TSHIELD_RELOADER | | | 2073 | TSHIP_BIG | TSHIP_MOVEABLE | | 2074 | TDOCK_TRADE | TDOCK | | 2075 | TDOCK_EQUIPMENT | TDOCK | | 2076 | TDOCK_PIRATEBASE | TDOCK | | 2078 | TDOCK_KHAAK | TDOCK | | 2079 | TSATELLITECLASS | TSHIP_STATIONARY | | 2080 | TADVANCEDSATELLITE | TSATELLITE | | 2081 | TSHIPYARD_SMALL | TSHIPYARD | | 2082 | TSHIPYARD_BIG | TSHIPYARD | | 2084 | TCRATE_FLYINGWARE | TGBODY | | 2085 | TMISSILE | TGBODY | | 2087 | THULL_RELOADER | | | 2088 | TDEBRIS | TGBODY | | 2089 | TDEBRIS_CREATOR | | | 2090 | TWRECK | TGBODY | | 2091 | TWRECK_CREATOR | | | 2092 | TFREIGHTDRONE | TDRONE_BASE_CLASS | | 2100 | TCLIENT | | | 2115 | TGAMEOVER | | | 2116 | TBUILD_FACTORY | | | 2119 | TPATCH | | | 2120 | TSCRIPT_EDITOR | | | 2121 | TSCRIPT_UPDATE | | | 2122 | TPLAY_CUTSCENES | | | 2123 | TCAMERA | | | 2124 | TSCRIPT | TGBODY | | 2125 | TMONITOR | | | 2126 | TMONITORCONTROL | | | 2127 | TAL_PLUGINS | | | 2128 | TGODENGINE | | | 2129 | TTRADEMASTER | | | 2130 | TSCENE3D | | | 2131 | TSHIP_KHAAKCLUSTER | TSHIP_M3 | | 2132 | TOBJ_KHAAK | TRACE | | 2133 | TSHIP_LITTLE | TSHIP_MOVEABLE | | 2134 | TSHIP_MOVEABLE | TSHIP | | 2135 | TSHIP_STATIONARY | TSHIP | | 2136 | TSHIP_SPECIAL | TSHIP | | 2140 | TSHIP_M5_RACING | TSHIP_M5 | | 2141 | TNAV_POINT | TSPECIAL | | 2142 | TJOB_MAP | | | 2150 | TMD_CUE | | | 2151 | TMISSION_DIRECTOR | TMD_CUE | | 2200 | TMENU | | | 2201 | TMENU_BACKGROUND | | | 2210 | TMENU_ID | TMENU | | 2211 | TMENU_SHIP | TMENU_ID | | 2212 | TMENU_STATION_FABRIC | TMENU_STATION | | 2213 | TMENU_STATION_DOCK | TMENU_STATION | | 2214 | TMENU_PLAYER | TMENU_ID | | 2216 | TMENU_SECTOR | TMENU | | 2217 | TMENU_TRADE | TMENU_TRADE_BASIC | | 2222 | TMENU_WARE | TMENU_ID | | 2223 | TMENU_ASTEROID | TMENU_ID | | 2224 | TMENU_WARPGATE | TMENU_ID | | 2225 | TMENU_DIALOG | TMENU_ID | | 2226 | TMENU_LOADSAVE | TMENU_ID | | 2228 | TMENU_GALAXY | TMENU | | 2229 | TMENU_SHIPINFO | TMENU_ID | | 2230 | TMENU_SHIPLIST | TMENU | | 2231 | TMENU_STATION | TMENU_ID | | 2232 | TMENU_SHIPLIST_CARRIED | TMENU_SHIPLIST | | 2233 | TMENU_SHIPLIST_OWNED | TMENU_SHIPLIST | | 2235 | TMENU_MAIN | TMENU_ID | | 2236 | TMENU_WEAPONS | TMENU_ID | | 2243 | TMENU_STATIONINFO | TMENU_ID | | 2245 | TMENU_BIGTEXT | TMENU_ID | | 2246 | TMENU_BIGTEXT_EXT | TMENU_BIGTEXT | | 2249 | TMENU_SELECTWARE | TMENU_ID | | 2251 | TMENU_PLAYEROWNED | TMENU_BIGTEXT_EXT | | 2252 | TMENU_INPUTSTRING | TMENU_ID | | 2253 | TMENU_FREIGHTBAY | TMENU_TRADE_BASIC | | 2256 | TMENU_CHANGESHIP | TMENU_SHIPLIST | | 2257 | TMENU_UFOINFO | TMENU_SHIP | | 2258 | TMENU_ASTRONAUT | TMENU_SHIP | | 2259 | TMENU_OPTIONS | TMENU_ID | | 2261 | TMENU_CHANGENAME_PLAYER | TMENU_INPUTSTRING | | 2262 | TMENU_LOGENTRY | TMENU_INPUTSTRING | | 2263 | TMENU_UPGRADESHIPS | TMENU_TRADE | | 2264 | TMENU_TRADE_BASIC | TMENU_ID | | 2265 | TMENU_CHANGENAME_OBJECT | TMENU_INPUTSTRING | | 2266 | TMENU_FREIGHTEXCHANGE | TMENU_TRADE_BASIC | | 2267 | TMENU_JUMPDRIVE | TMENU_ID | | 2268 | TMENU_TRADEUTILITIES | TMENU_BIGTEXT | | 2269 | TMENU_LOAD_TL | TMENU_ID | | 2270 | TMENU_UNLOAD_TL | TMENU_ID | | 2271 | TMENU_SCE | TMENU_BIGTEXT_EXT | | 2272 | TMENU_SCE_INPUT | TMENU_INPUTSTRING | | 2273 | TMENU_SCRIPT_INPUT | TMENU_ID | | 2274 | TMENU_SCRIPT_EXECUTE | TMENU_BIGTEXT | | 2275 | TMENU_SCRIPT_SELECT | TMENU_ID | | 2276 | TMENU_ASK | TMENU_ID | | 2277 | TMENU_QUESTION | TMENU_ASK | | 2278 | TMENU_COMMAND | TMENU_ID | | 2279 | TMENU_TRADE_EXT | TMENU_TRADE | | 2287 | TMENU_RECORDING | TMENU_INPUTSTRING | | 2288 | TMENU_BBS | TMENU_BIGTEXT_EXT | | 2289 | TMENU_MESSAGES | TMENU_BIGTEXT | | 2290 | TMENU_SCRIPT_DEBUG | TMENU_BIGTEXT_EXT | | 2291 | TMENU_SCRIPT_GLOBALTASK | TMENU_BIGTEXT_EXT | | 2292 | TMENU_PLUGIN | TMENU_BIGTEXT | | 2293 | TMENU_COMMANDINFO | TMENU_ID | | 2294 | TMENU_MERCHANT | TMENU_BIGTEXT | | 2295 | TMENU_MERCHANTINFO | TMENU_ID | | 2296 | TMENU_CONTROLS | TMENU_BIGTEXT | | 2297 | TMENU_MISSIONLOG | TMENU | | 2299 | TMENU_CHANGENAME_FORMATION | TMENU_INPUTSTRING | | 2300 | TINPUT_CONTROL | | | 2301 | TQUEST_SHIP_CONTROLS | | | 2302 | TMENU_INTERACTIVE_ASSISTANCE_SSYSTEM | TMENU_ID | | 2303 | TMENU_COMPLEX_INFO | TMENU_STATIONINFO | | 2304 | TMENU_HEAD_QUARTER_INFO | TMENU_STATIONINFO | | 2305 | TMENU_HEAD_QUARTER | TMENU_ID | | 2306 | TMENU_MISSION_DIRECTOR | TMENU_ID | | 2400 | TMENU_KEYS | | | 2401 | TMERCHANT | | | 2402 | TQUICKMENU | | | 2403 | TQUICKMENU_PLAYER_SPACE | TQUICKMENU | | 2404 | TQUICKMENU_PLAYER_STATION | TQUICKMENU | | 2405 | TQUICKMENU_PLAYER_NAVIGATION | TQUICKMENU | | 2406 | TQUICKMENU_PLAYER_PILOT | TQUICKMENU | | 2407 | TQUICKMENU_PLAYER_PERSONAL | TQUICKMENU | | 2408 | TQUICKMENU_PLAYER_STATION_SUB_STATION | TQUICKMENU | | 2409 | TQUICKMENU_PLAYER_ASSETS | TQUICKMENU | | 2410 | TQUICKMENU_ACTION_SHIP | TQUICKMENU | | 2411 | TQUICKMENU_ACTION_STATION | TQUICKMENU | | 2412 | TQUICKMENU_ACTION_FWARE_WRECK | TQUICKMENU | | 2413 | TQUICKMENU_ACTION_ASTEROID_DEBRIS_GATE | TQUICKMENU | | 2420 | TQUICKMENU_MAIN | TQUICKMENU | | 2421 | TQUICKMENU_LOAD_SAVE_LIST | TQUICKMENU | | 2422 | TQUICKMENU_LOAD | TQUICKMENU_LOAD_SAVE_LIST | | 2423 | TQUICKMENU_SAVE | TQUICKMENU_LOAD_SAVE_LIST | | 2424 | TQUICKMENU_CONFIRM | TQUICKMENU | | 2430 | TQUICKMENU_SHIP_GROUPS | TQUICKMENU | | 2431 | TQUICKMENU_MANAGE_SHIP_GROUP | TQUICKMENU | | 2432 | TQUICKMENU_SHIPS_IN_GROUP | TQUICKMENU | | 2500 | TPLAYER_INFO | | | 2600 | TGAME_TIP | | | 2601 | TMENU_WINDOW | | | 2700 | TICON_MENU | | | 2701 | TICON_MAIL | TICON_MENU | | 2702 | TICON_COCPIT | TICON_MENU | | 2703 | TICON_WEAPON | TICON_MENU | | 2721 | TICON_MENU_SELECTED | TICON_MENU | | 3001 | TQUESTMASTER | | | 3003 | TPLOT | TQUESTMASTER_QUESTS_BASIC | | 3100 | TQUEST | | | 3101 | TQUESTMASTER_QUESTS_BASIC | TQUEST | | 4158 | TQUEST158 | TQUESTMASTER_QUESTS_BASIC | | 4172 | TQUEST172_PIRATE_TRANSPORT_P1235 | TQUESTMASTER_QUESTS_BASIC | | 4190 | TQUEST190_HITCHHIKER_P1290 | TQUESTMASTER_QUESTS_BASIC | | 4193 | TQUEST193_GENERIC_TRADING_1_P1293 | TQUESTMASTER_QUESTS_BASIC | | 4194 | TQUEST194_BBS_NEWS_ENGINE_P1294 | TQUESTMASTER_QUESTS_BASIC | | 4214 | TQUEST214_BBS_TOURBUS_P1314 | TQUESTMASTER_QUESTS_BASIC | | 4216 | TQUEST216_BBS_ASSASINATION_P1316 | TQUESTMASTER_QUESTS_BASIC | | 4217 | TQUEST217_BBS_TAXI_P1317 | TQUESTMASTER_QUESTS_BASIC | | 4219 | TQUEST219_BUY_SECTOR_MAP_P1319 | TQUESTMASTER_QUESTS_BASIC | | 4223 | TQ223_PLOT3_P301323 | TPLOT | | 4224 | TQ224_PLOT4_P301324 | TPLOT | | 4225 | TQ225_PLOT5_P301325 | TPLOT | | 4226 | TQ226_PLOT6_P301326 | TPLOT | | 4227 | TQ227_PLOT7_P301327 | TPLOT | | 4228 | TQ228_PLOT8_P301328 | TPLOT | | 4235 | TQUEST235_MIRIAS_BBS_ENTRY_P301335 | TQUESTMASTER_QUESTS_BASIC | | 4263 | TQUEST263_GENERIC_TRADING_B_P1363 | TQUESTMASTER_QUESTS_BASIC | | 4267 | TQUEST267_BBS_LOTTERY_GAME_P1367 | TQUESTMASTER_QUESTS_BASIC | | 4268 | TQUEST268_BBS_BLACK_JACK_P301368 | TQUESTMASTER_QUESTS_BASIC | | 4269 | TQUEST269_BBS_PIRATE_HACKERS_P1369 | TQUESTMASTER_QUESTS_BASIC | | 4270 | TQUEST270_BBS_BUY_KHAAK_SECTOR_COORDS_P1370 | TQUESTMASTER_QUESTS_BASIC | | 4271 | TQUEST271_BBS_BUY_KHAAK_SPECS_P1371 | TQUESTMASTER_QUESTS_BASIC | | 4275 | TQUEST275_XENON_INVASION_P1375 | TQUESTMASTER_QUESTS_BASIC | | 4281 | TQUEST281_STATION_REPAIR_II_P1381 | TQUESTMASTER_QUESTS_BASIC | | 4289 | TQUEST289_SCRIPT_MESSAGE_HANDLER_P301389 | TQUESTMASTER_QUESTS_BASIC | | 4290 | TQUEST290_EMPTY_P1390 | TQUESTMASTER_QUESTS_BASIC | | 4291 | TQUEST291_BBS_GONER_PREACHING_P301391 | TQUESTMASTER_QUESTS_BASIC | | 4293 | TQUEST293_SCRIPT_QUEST_P301393 | TQUESTMASTER_QUESTS_BASIC | | 4299 | TQUEST299_RACING_QUEST_P301399 | TQUESTMASTER_QUESTS_BASIC | | 4300 | TQUEST300_SECTOR_AUCTION_QUEST_P301400 | TQUESTMASTER_QUESTS_BASIC | | 4301 | TQUEST301_SECTOR_AUCTION_BBS_REPORTS_P301401 | TQUESTMASTER_QUESTS_BASIC | | 4302 | TQUEST302_EMPTY_P1402 | TQUESTMASTER_QUESTS_BASIC | | 4303 | TQUEST303_SOFT_SIGN_SCRAMBLER_P301403 | TQUESTMASTER_QUESTS_BASIC | | 4304 | TQUEST304_SECTOR_AUCTION_QUEST_V2_P301404 | TQUESTMASTER_QUESTS_BASIC | | 4305 | TQUEST305_SECTOR_AUCTION_BBS_REPORTS_V2_P301405 | TQUESTMASTER_QUESTS_BASIC | | 4306 | TQUEST306_BBS_RACING_HANDLER_P301406 | TQUESTMASTER_QUESTS_BASIC | | 4307 | TQUEST307_BALA_GI_HQ_MISSION_P301407 | TQUESTMASTER_QUESTS_BASIC | | 4314 | TQUEST314_CHECK_START_POS | TQUESTMASTER_QUESTS_BASIC | | 4316 | TQUEST316_BBS_QUEST_TREASURE_HUNT_P304316 | TQUESTMASTER_QUESTS_BASIC | | 4317 | TQUEST317_BBS_QUEST_DONATION_P3043317 | TQUESTMASTER_QUESTS_BASIC | | 4320 | TQUEST320_EMPTY_P1420 | TQUESTMASTER_QUESTS_BASIC | | 4322 | TQUEST322_BBS_PIRATES_CRATE_P301422 | TQUESTMASTER_QUESTS_BASIC | | 4323 | TQUEST323_BBS_QUEST_BLACKMAIL_P301422 | TQUESTMASTER_QUESTS_BASIC | | 4324 | TQUEST324_SECTOR_AUCTION_QUEST_V2_P1424 | TQUESTMASTER_QUESTS_BASIC | | 5000 | TUPGRADEMASTER | | | 5001 | TUPGRADE | | | 5003 | TUPGRADE1_DOCKING_COMPUTER | TUPGRADE | | 5004 | TUPGRADE2_BEST_SELLING_PRICE_LOCATOR | TUPGRADE | | 5005 | TUPGRADE3_TRANSPORTER_DEVICE | TUPGRADE | | 5006 | TUPGRADE4_JUMPDRIVE | TUPGRADE | | 5008 | TUPGRADE6_BEST_BUYS_LOCATOR | TUPGRADE | | 5012 | TUPGRADE10_STRAFE_DRIVE_EXTENSION | TUPGRADE | | 5013 | TUPGRADE11_CARGO_LIFESUPPORT_SYSTEM | TUPGRADE | | 5014 | TUPGRADE12_BOOST_EXTENSION | TUPGRADE | | 5015 | TUPGRADE13_NAVIGATION_RELAY_SATELLITE | TUPGRADE | | 5016 | TUPGRADE14_SQUASH_MINE | TUPGRADE | | 5017 | TUPGRADE15_LASERTOWER | TUPGRADE | | 5018 | TUPGRADE16_FIGHTDRONE | TUPGRADE | | 5019 | TUPGRADE17_FREIGHTDRONE | TUPGRADE | | 5035 | TUPGRADE33_ADVANCEDSATELLITE | TUPGRADE | | 5038 | TUPGRADE36_ORE_COLLECTOR | TUPGRADE | | 5043 | TUPGRADE41_SPACEFLYCOLLECTOR | TUPGRADE | | 6000 | TEVENT | | | 6001 | TEVENT_6001 | TEVENT | | 6002 | TEVENT_KHAAK_INVASION | TEVENT | | 6003 | TEVENT_P2203 | TEVENT | | 6004 | TEVENT_STATION_DESTRUCTION | TEVENT | | 6005 | TEVENT_ATTACK_P2202 | TEVENT | | 8047 | TRANDOMNPC_PACK | | | 8048 | TRANDOMNPC_SHIP | | | 8060 | TX3_PLOT_SHIP_M5 | TSHIP_M5 | | 8061 | TX3_PLOT_SHIP_TL | TSHIP_TL | | 8070 | TX3_PLOT_SHIP_M3 | TSHIP_M3 | | 8071 | TX3_PLOT_SHIP_M4 | TSHIP_M4 | | 8072 | TX3_PLOT_SHIP_M6 | TSHIP_M6 | | 8073 | TX3_PLOT_SHIP_TP | TSHIP_TP | | 8074 | TX3_PLOT_SHIP_TS | TSHIP_TS | | 8075 | TX3_PLOT_SHIP_GONER | TSHIP_GONER | | 8076 | TX3_PLOT_SHIP_TL_2 | TSHIP_TL | | 8077 | TX3_PLOT_SHIP_TP_2 | TSHIP_TP | | 8078 | TX3_PLOT_SHIP_M6_2 | TSHIP_M6 | | 8079 | TX3_PLOT_OBJECTS | | | 8080 | TWAYPOINT | | | 8081 | TCRATE_XENONCONTAINER | TCRATE_FLYINGWARE | | 8082 | TX3_PLOT_SPECIAL | TSPECIAL | | 8083 | TX3_PLOT_SHIP | TSHIP | | 8084 | TX3_PLOT_OBJECTS_SPEAKER | TSHIP_SPEAKER | | 8085 | TX3_PLOT_MARANI_STATION | TSHIPYARD_BIG | | 8086 | TX3_PLOT_YAKI_STATION | TFACTORY | | 8087 | TX3_PLOT_SPY_DRONE | TSHIP_M5 | | 8088 | TX3_PLOT_MINE | TMINE | |
_________________ Умножим энтропию на 0 :-)
Последний раз редактировалось: Chem (17:38 03-04-2008), всего редактировалось 5 раз(а) |
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
А вот и иерархия объектов в читаемой форме
Код: |
TX_AUDIO
TINIT
TGALAXY
TSECTOR
TPLANET
TRACEBASE
+--TRACE
+--TPIRATES
+--TGONER
+--TOBJ_KHAAK
TSUN
TPLAYER
TNEBULA
TGBODY
+--TCUSTOM_GALOBJ
+--TASTEROID
+--TGATE
+--TSPECIAL
| +--TNAV_POINT
| +--TX3_PLOT_SPECIAL
+--TCRATE_FLYINGWARE
| +--TCRATE_XENONCONTAINER
+--TMISSILE
+--TDEBRIS
+--TWRECK
+--TSCRIPT
+--TSHIP
| +--TSHIP_SPEAKER
| | +--TX3_PLOT_OBJECTS_SPEAKER
| +--TSHIP_MOVEABLE
| | +--TSHIP_BIG
| | | +--TSHIP_CARRIER
| | | +--TSHIP_HUGE
| | | | +--TSHIP_M1
| | | | +--TSHIP_M2
| | | | +--TSHIP_TL
| | | | +--TX3_PLOT_SHIP_TL
| | | | +--TX3_PLOT_SHIP_TL_2
| | | +--TSHIP_M6
| | | | +--TX3_PLOT_SHIP_M6
| | | | +--TX3_PLOT_SHIP_M6_2
| | | +--TSHIP_M7
| | +--TSHIP_LITTLE
| | +--TSHIP_TS
| | | +--TSHIP_TP
| | | | +--TX3_PLOT_SHIP_TP
| | | | +--TX3_PLOT_SHIP_TP_2
| | | +--TSHIP_TS_PIRATE
| | | +--TX3_PLOT_SHIP_TS
| | +--TSHIP_FIGHTER
| | | +--TSHIP_M3
| | | | +--TSHIP_KHAAKCLUSTER
| | | | +--TX3_PLOT_SHIP_M3
| | | +--TSHIP_M4
| | | | +--TX3_PLOT_SHIP_M4
| | | +--TSHIP_M5
| | | +--TSHIP_M5_RACING
| | | +--TX3_PLOT_SHIP_M5
| | | +--TX3_PLOT_SPY_DRONE
| | +--TSHIP_GONER
| | | +--TX3_PLOT_SHIP_GONER
| | +--TDRONE_BASE_CLASS
| | +--TFIGHTDRONE
| | +--TFREIGHTDRONE
| +--TSHIP_STATIONARY
| | +--TLASERTOWER
| | +--TMINE
| | | +--TX3_PLOT_MINE
| | +--TSATELLITECLASS
| | +--TBEACON
| | +--TSATELLITE
| | +--TADVANCEDSATELLITE
| +--TSHIP_SPECIAL
| | +--TSHIP_ASTRONAUT
| | +--TSHIP_UFO
| | +--TSPACEFLY
| +--TX3_PLOT_SHIP
+--TSTATION
+--TFACTORY
| +--TSHIPYARD
| | +--TSHIPYARD_SMALL
| | +--TSHIPYARD_BIG
| | +--TX3_PLOT_MARANI_STATION
| +--TCOMPLEX
| | +--TCOMPLEX_HQ
| +--TX3_PLOT_YAKI_STATION
+--TDOCK
+--TDOCK_GONER
+--THEAD_QUARTER
+--TDOCK_TRADE
+--TDOCK_EQUIPMENT
+--TDOCK_PIRATEBASE
+--TDOCK_KHAAK
TGLOBAL_SCRIPT_MAP
TREBUILD
TSHIELD_RELOADER
THULL_RELOADER
TDEBRIS_CREATOR
TWRECK_CREATOR
TCLIENT
TGAMEOVER
TBUILD_FACTORY
TPATCH
TSCRIPT_EDITOR
TSCRIPT_UPDATE
TPLAY_CUTSCENES
TCAMERA
TMONITOR
TMONITORCONTROL
TAL_PLUGINS
TGODENGINE
TTRADEMASTER
TSCENE3D
TJOB_MAP
TMD_CUE
+--TMISSION_DIRECTOR
TMENU
+--TMENU_ID
| +--TMENU_SHIP
| | +--TMENU_UFOINFO
| | +--TMENU_ASTRONAUT
| +--TMENU_PLAYER
| +--TMENU_WARE
| +--TMENU_ASTEROID
| +--TMENU_WARPGATE
| +--TMENU_DIALOG
| +--TMENU_LOADSAVE
| +--TMENU_SHIPINFO
| +--TMENU_STATION
| | +--TMENU_STATION_FABRIC
| | +--TMENU_STATION_DOCK
| +--TMENU_MAIN
| +--TMENU_WEAPONS
| +--TMENU_STATIONINFO
| | +--TMENU_COMPLEX_INFO
| | +--TMENU_HEAD_QUARTER_INFO
| +--TMENU_BIGTEXT
| | +--TMENU_BIGTEXT_EXT
| | | +--TMENU_PLAYEROWNED
| | | +--TMENU_SCE
| | | +--TMENU_BBS
| | | +--TMENU_SCRIPT_DEBUG
| | | +--TMENU_SCRIPT_GLOBALTASK
| | +--TMENU_TRADEUTILITIES
| | +--TMENU_SCRIPT_EXECUTE
| | +--TMENU_MESSAGES
| | +--TMENU_PLUGIN
| | +--TMENU_MERCHANT
| | +--TMENU_CONTROLS
| +--TMENU_SELECTWARE
| +--TMENU_INPUTSTRING
| | +--TMENU_CHANGENAME_PLAYER
| | +--TMENU_LOGENTRY
| | +--TMENU_CHANGENAME_OBJECT
| | +--TMENU_SCE_INPUT
| | +--TMENU_RECORDING
| | +--TMENU_CHANGENAME_FORMATION
| +--TMENU_OPTIONS
| +--TMENU_TRADE_BASIC
| | +--TMENU_TRADE
| | | +--TMENU_UPGRADESHIPS
| | | +--TMENU_TRADE_EXT
| | +--TMENU_FREIGHTBAY
| | +--TMENU_FREIGHTEXCHANGE
| +--TMENU_JUMPDRIVE
| +--TMENU_LOAD_TL
| +--TMENU_UNLOAD_TL
| +--TMENU_SCRIPT_INPUT
| +--TMENU_SCRIPT_SELECT
| +--TMENU_ASK
| | +--TMENU_QUESTION
| +--TMENU_COMMAND
| +--TMENU_COMMANDINFO
| +--TMENU_MERCHANTINFO
| +--TMENU_INTERACTIVE_ASSISTANCE_SSYSTEM
| +--TMENU_HEAD_QUARTER
| +--TMENU_MISSION_DIRECTOR
+--TMENU_SECTOR
+--TMENU_GALAXY
+--TMENU_SHIPLIST
| +--TMENU_SHIPLIST_CARRIED
| +--TMENU_SHIPLIST_OWNED
| +--TMENU_CHANGESHIP
+--TMENU_MISSIONLOG
TMENU_BACKGROUND
TINPUT_CONTROL
TQUEST_SHIP_CONTROLS
TMENU_KEYS
TMERCHANT
TQUICKMENU
+--TQUICKMENU_PLAYER_SPACE
+--TQUICKMENU_PLAYER_STATION
+--TQUICKMENU_PLAYER_NAVIGATION
+--TQUICKMENU_PLAYER_PILOT
+--TQUICKMENU_PLAYER_PERSONAL
+--TQUICKMENU_PLAYER_STATION_SUB_STATION
+--TQUICKMENU_PLAYER_ASSETS
+--TQUICKMENU_ACTION_SHIP
+--TQUICKMENU_ACTION_STATION
+--TQUICKMENU_ACTION_FWARE_WRECK
+--TQUICKMENU_ACTION_ASTEROID_DEBRIS_GATE
+--TQUICKMENU_MAIN
+--TQUICKMENU_LOAD_SAVE_LIST
| +--TQUICKMENU_LOAD
| +--TQUICKMENU_SAVE
+--TQUICKMENU_CONFIRM
+--TQUICKMENU_SHIP_GROUPS
+--TQUICKMENU_MANAGE_SHIP_GROUP
+--TQUICKMENU_SHIPS_IN_GROUP
TPLAYER_INFO
TGAME_TIP
TMENU_WINDOW
TICON_MENU
+--TICON_MAIL
+--TICON_COCPIT
+--TICON_WEAPON
+--TICON_MENU_SELECTED
TQUESTMASTER
TQUEST
+--TQUESTMASTER_QUESTS_BASIC
+--TPLOT
| +--TQ223_PLOT3_P301323
| +--TQ224_PLOT4_P301324
| +--TQ225_PLOT5_P301325
| +--TQ226_PLOT6_P301326
| +--TQ227_PLOT7_P301327
| +--TQ228_PLOT8_P301328
+--TQUEST158
+--TQUEST172_PIRATE_TRANSPORT_P1235
+--TQUEST190_HITCHHIKER_P1290
+--TQUEST193_GENERIC_TRADING_1_P1293
+--TQUEST194_BBS_NEWS_ENGINE_P1294
+--TQUEST214_BBS_TOURBUS_P1314
+--TQUEST216_BBS_ASSASINATION_P1316
+--TQUEST217_BBS_TAXI_P1317
+--TQUEST219_BUY_SECTOR_MAP_P1319
+--TQUEST235_MIRIAS_BBS_ENTRY_P301335
+--TQUEST263_GENERIC_TRADING_B_P1363
+--TQUEST267_BBS_LOTTERY_GAME_P1367
+--TQUEST268_BBS_BLACK_JACK_P301368
+--TQUEST269_BBS_PIRATE_HACKERS_P1369
+--TQUEST270_BBS_BUY_KHAAK_SECTOR_COORDS_P1370
+--TQUEST271_BBS_BUY_KHAAK_SPECS_P1371
+--TQUEST275_XENON_INVASION_P1375
+--TQUEST281_STATION_REPAIR_II_P1381
+--TQUEST289_SCRIPT_MESSAGE_HANDLER_P301389
+--TQUEST290_EMPTY_P1390
+--TQUEST291_BBS_GONER_PREACHING_P301391
+--TQUEST293_SCRIPT_QUEST_P301393
+--TQUEST299_RACING_QUEST_P301399
+--TQUEST300_SECTOR_AUCTION_QUEST_P301400
+--TQUEST301_SECTOR_AUCTION_BBS_REPORTS_P301401
+--TQUEST302_EMPTY_P1402
+--TQUEST303_SOFT_SIGN_SCRAMBLER_P301403
+--TQUEST304_SECTOR_AUCTION_QUEST_V2_P301404
+--TQUEST305_SECTOR_AUCTION_BBS_REPORTS_V2_P301405
+--TQUEST306_BBS_RACING_HANDLER_P301406
+--TQUEST307_BALA_GI_HQ_MISSION_P301407
+--TQUEST314_CHECK_START_POS
+--TQUEST316_BBS_QUEST_TREASURE_HUNT_P304316
+--TQUEST317_BBS_QUEST_DONATION_P3043317
+--TQUEST320_EMPTY_P1420
+--TQUEST322_BBS_PIRATES_CRATE_P301422
+--TQUEST323_BBS_QUEST_BLACKMAIL_P301422
+--TQUEST324_SECTOR_AUCTION_QUEST_V2_P1424
TUPGRADEMASTER
TUPGRADE
+--TUPGRADE1_DOCKING_COMPUTER
+--TUPGRADE2_BEST_SELLING_PRICE_LOCATOR
+--TUPGRADE3_TRANSPORTER_DEVICE
+--TUPGRADE4_JUMPDRIVE
+--TUPGRADE6_BEST_BUYS_LOCATOR
+--TUPGRADE10_STRAFE_DRIVE_EXTENSION
+--TUPGRADE11_CARGO_LIFESUPPORT_SYSTEM
+--TUPGRADE12_BOOST_EXTENSION
+--TUPGRADE13_NAVIGATION_RELAY_SATELLITE
+--TUPGRADE14_SQUASH_MINE
+--TUPGRADE15_LASERTOWER
+--TUPGRADE16_FIGHTDRONE
+--TUPGRADE17_FREIGHTDRONE
+--TUPGRADE33_ADVANCEDSATELLITE
+--TUPGRADE36_ORE_COLLECTOR
+--TUPGRADE41_SPACEFLYCOLLECTOR
TEVENT
+--TEVENT_6001
+--TEVENT_KHAAK_INVASION
+--TEVENT_P2203
+--TEVENT_STATION_DESTRUCTION
+--TEVENT_ATTACK_P2202
TRANDOMNPC_PACK
TRANDOMNPC_SHIP
TX3_PLOT_OBJECTS
TWAYPOINT
|
_________________ Умножим энтропию на 0 :-)
Последний раз редактировалось: Chem (17:21 03-04-2008), всего редактировалось 1 раз |
|
|
M_A_G
53 EGP
 Рейтинг канала: 5(142) Репутация: 2 Сообщения: 41 Откуда: Питер Зарегистрирован: 04.01.2008
 |
|
Результаты анализа класса TFACTORY в контексте потребления втор-ресов и, что оказалось приятной неожиданностью, так же потребления (утилизации) доков и торговых станций.
Надеюсь, я это всё сюда в тему кидаю
Большое спасибо Chem за высланные исходники и найденные ключевые места в них, что побороло таки мою лень
Сперва, код с комментами, выводы ниже.
Код: |
//при старте производства используется вычисление времени производства, в зависимости от наличия переменной TFACTORY.fa_SResEffect
// из TFACTORY.Production()
if(TFACTORY.fa_SResEffect)
{
// loc3 = от 1/2 fa_SResEffect до fa_SResEffect
var loc3 = (TFACTORY.fa_SResEffect + SE_Random(TFACTORY.fa_SResEffect) + 1) / 2;
// loc3 - поправка к текущему циклу
// чем больше была поправка сейчас, тем меньше останется на следующий цикл
// fa_SResEffect = от 0 до 1/2 входной fa_SResEffect
TFACTORY.fa_SResEffect = TFACTORY.fa_SResEffect - loc3;
TFACTORY.fa_CurProdTime = (
// время производства без втор ресов
TFACTORY.fa_ProdTime[TFACTORY.fa_ProductType << 16 | TFACTORY.fa_ProductSubType]
// минус к циклу производства в % равен ( loc3 / rel_value )
*(100 - loc3 / SA_GetTypeRelValue(TFACTORY.fa_ProductType, TFACTORY.fa_ProductSubType) )
)/100;
}
else
{
TFACTORY.fa_CurProdTime =
TFACTORY.fa_ProdTime[TFACTORY.fa_ProductType<<16|TFACTORY.fa_ProductSubType];
}
// Далее из функции TFACTORY.Trade()
// этот код находится в цикле, срабатывающем раз в среднем 61.6 секунду для фабрик и раз в 302.7 секунд для доков
// точные циферки из экспериментальной статистики
// в конце кода - собственно вычисление задержки, там подробней
// данные относятся к неактивному сектору, то есть, сектору, где нет игрока, и игрок не смотрит на него через карту
// есть подозрение, что в противном случае, период будет другим
....
// цикл по втор-ресам
while( loc2 = SE_TableNext(TFACTORY.fa_SResources, loc2) )
{
// maintype
var loc3 = loc2 >> 16 & 255;
// subtype
var loc4 = loc2 & 65535;
// loc5 - объём на складе
var loc5 = TSTATION.st_Wares[loc2];
// проверка, что это оборудование и
// добавление на склад 1 штуки, если склад был пустой
// данные строки заставили предположить, что для доков и торговых станций используется этот же алгоритм
// и с точки зрения игры, товары доков - это втор-ресы =)
if ( loc3 == 16 && global.ga_WareEquipmentFlags[loc4] )
{
if ( !loc5 )
{
this->AddWare(loc3, loc4, 1);
}
continue;
}
// если ресы есть
if ( loc5 )
{
// если это у нас кристаллы и электростанция
if ( loc3 == 16 && loc4 == 1 && SA_GetTypeGSubType(6, TSTATION.st_SubType) == 4 )
{
// раз в 7 циклов (минут) идём дальше
if ( SE_Random(7) )
{
continue;
}
// то есть, электростанции не потребляют кристаллы, если производство стоит
// и потребляют они их в 7 раз меньше (реже) других
// максимум на складе
var loc6 = this->GetWareTypeMaxStore(TFACTORY.fa_ProductType, TFACTORY.fa_ProductSubType);
// сколько сейчас на складе
var loc7 = TSTATION.st_Wares[TFACTORY.fa_ProductType << 16 | TFACTORY.fa_ProductSubType];
// если в следующем цикле получится больше, чем может влезть - пропускаем
if ( loc7 + TFACTORY.fa_ProdCount[TFACTORY.fa_ProductType << 16 | TFACTORY.fa_ProductSubType]
> loc6 )
{
continue;
}
}
// в зависимости от loc3, loc6 = 6 или 12
var loc6 = 0;
switch (loc3 + -7)
{
case 1: // 8 - пушки
case 2: // 9 - щиты
case 3: // 10 - ракеты
case 9: // 16 - hi-tech (Warheads, Crystals, Quantum Tubes, Microchips, Computer Components, Spaceflies)
// к ним же относятся - рабы =), спутники, оборудование
{
loc6 = 6;
break;
}
case 0: // 7 - корабли
case 4: // 11 - батарейки
case 5: // 12 - всякая фигня (не нужная)
case 6: // 13 - начальные ресы
case 7: // 14 - питание и редкие товары
case 8: // 15 - руда, вафли, нивидиум
{
loc6 = 12;
break;
}
}
// loc6 * loc1
// --------------- = loc7
// rel_value * 200
//
// ДЛЯ ФАБРИК (loc1 от 59 до 63, в среднем 61.6)
// loc7 будет равно 0 при relvalue больше или равным 4(2)
// в скобках здесь и далее для продуктов с loc6 == 6
//
// ДЛЯ ДОКОВ (loc1 от 300 до 305, в среднем 302.7)
// loc7 будет равно 0 при relvalue больше 18(9)
//
// Если loc7 не == 0, то будем списывать каждый цикл по loc7 * размер_станции
//
var loc7 = ((loc1*loc6) / 200) / SA_GetTypeRelValue(loc3, loc4);
if (loc7 == 0)
{
// rel_value * 200
// --------------- = loc8
// loc6 * loc1
//
// то есть, loc8 = 1/loc7 (только не забываем про то, что это целочисленная арифметика!)
//
var loc8 = (SA_GetTypeRelValue(loc3, loc4) * 200) / (loc6*loc1);
// если loc8 == 0, (но такого НЕ может быть, ибо мы сюда вошли по условию loc7 == 0)
// ИЛИ один_случай_из_loc8
// но если loc8 == 1, то SE_Random вернёт всегда 0 (?) (по экспериментам - именно так)
//
// ДЛЯ ФАБРИК
// если loc8 <= 1 ( relvalue < 8(4) ), списание каждые 60-63 сек. по 4 шт.
// ДЛЯ ДОКОВ
// если loc8 <= 1 ( relvalue <= 36(18) ), списание каждые 300-305 сек. по 16 шт.
//
if ( !loc8 || !SE_Random(loc8))
{
loc7 = loc1 / 20 + 1;
}
else
{
loc7 = 0;
}
}
// учитываем размер станции
if (loc7 != 0)
{
loc7 = SE_MulFix(loc7, this->GetScaleFactor());
}
// списываем то, что есть, не больше
if (loc7 > loc5)
{
loc7 = loc5;
}
// если что-то списали - считаем коэффициент к эффективности
// смысл имеет только для фабрик =)
if( loc7 > 0 )
{
this->AddWare(loc3, loc4, -loc7);
// loc7 фактически всегда = 4*размер_станции,
// fa_SResEffect += от 1 до ( 40 * sSize * rel_value );
TFACTORY.fa_SResEffect = TFACTORY.fa_SResEffect +
( SE_Random( 10 * loc7 * SA_GetTypeRelValue(loc3, loc4)) + 1 );
// fa_SResEffect в среднем будет равно relvalueS * 20 (для S станций)
// и даст эффект в relvalueS * 20 / relvaluePr %
// (relvalueS - втор-ресов, relvaluePr - продукции)
// вот оно - ограничение "не более 15%"
// но накладывается оно для текущего цикла производства,
// а учитывается fa_SResEffect в другом месте - асинхронно.
// отсюда и глюк с комплексами..
var loc8 = 15 * SA_GetTypeRelValue(TFACTORY.fa_ProductType, TFACTORY.fa_ProductSubType);
if (TFACTORY.fa_SResEffect > loc8)
{
TFACTORY.fa_SResEffect = loc8;
}
}
}
}
...
// это конец цикла, тут задаётся задержка и вычисляется loc1
//
loc4 = ((TFACTORY.fa_FocusDelay + SE_Random(3000)) * global.gs_DelayFactor) / 1000;
loc3 = TI_WaitForInterrupt(loc4, this);
// похоже, loc3 == времени, сколько оставалось ждать, когда прерывание произошло
// то есть, loc1 - реально сколько прошло времени
// по экспериментам, loc1 от 59 до 63, в среднем 61.6 (для фабрик)
// и ни разу не было зарегистрировано времени меньшего 59 сек.
// однако, когда проверял доки, бывали циклы не по 300 секунд, а по 60
// но это были единичные случаи, и я забил разбираться.
// есть подозрение, что случалось оно, когда я "смотрел" за станцией
loc1 = (loc4 - loc3) / 1000;
if (loc1 <= 0)
{
loc1 = 1;
}
|
Собственно. Что получается.
Все товары разбиты на 2 группы:
1. пушки, щиты, ракеты, hi-tech (Warheads, Crystals, Quantum Tubes, Microchips, Computer Components, Spaceflies), оборудование
2. корабли, батарейки, всякая фигня (не нужная), начальные ресы, питание и редкие товары, руда, вафли, нивидиум
Соответственно, некоторые циферки для них различаются, буду писать цифру для второй группы, а в скобках - для первой
Все вычисления целочисленные, так что, 3.9 / 2 = 1!
Правила списания в порядке приоритета для фабрик (S типа, для дркгих - результат * множитель станции):
1. Если relvalue втор-реса < 4(2), списание будет каждые 60-63 секунды по 3.7(1.85)/relvalue шт.
2. Если relvalue < 8(4), списание каждые 60-63 сек. по 4 шт.
3. Списание каждый из ( relvalue / 3.7(1.85) ) 60-63 сек. интервалов по 4 шт., то есть, среднее время списания = 61,6 * relvalue / 3.7(1.85)
Для солярок поправки:
1. Кристаллы не списываются, если производство стоит.
2. Скорость списания снижена в 7 раз.
То же, для доков и торговых станций:
1. Если relvalue втор-реса <= 18(9), списание будет каждые 300-305 секунды по 18.2(9.1)/relvalue шт.
2. Если relvalue <= 36(18), списание каждые 300-305 сек. по 16 шт.
3. Списание каждый из ( relvalue / 18.2(9.1) ) 300-305 сек. интервалов по 16 шт., то есть, среднее время списания = 302,7 * relvalue / 18.2(9.1)
Цифры 61,6 и 302,7 взяты из экспериментов.
Алгоритм проверен экспериментальными данными, всё очень хорошо сходиться. Не считая того, что для продуктов с большим relvalue, нужно очень много времени для сбора статистики. Я больше 20 часов не выдерживал
Теперь, про увеличение эффективности производства:
Что бы длительность следующего цикла снизилась на 1%, необходимо, что бы за время цикла произошло в среднем ( relvaluePr / (relvalueS * 20 * размер_станции) ) списания втор-реса с relvalueS, для фабрики производящей relvaluePr.
Если просуммировать все списания всех втор-ресов за текущий цикл по формуле выше, получится поправка в % к следующему циклу.
Поправка обрезается до значения 15% от ТЕКУЩЕГО цикла. А если, дальше будет производиться что-то с меньшим relvalue? Да, уменьшение цикла может быть для него значительно большим.
При начале очередного цикла смотрится поправка и берется от 1/2 до её полного значения для уменьшения цикла. Остаток остаётся на следующий раз.
Примерчик
Если у нас есть GPPC(relvalue = 15000), у которого втор-рес - кристаллы (relvalue = 60, средний цикл = 1980), то за один цикл производства GPPC мы в среднем будем набирать поправку в N * relvalueS * 20 / relvaluePr = 7 * 60 * 20 / 15000 = 0.56%
При начале следующего цикла, она учтется и уменьшиться, но.. менее чем на 1% цикл не уменьшится. То есть, вероятность уменьшения цикла для GPPC фабрики мизерна (если с рандомом СИЛЬНО повезёт) и уменьшение может быть максимум на 1%.
add. Забыл добавить. Товары с relvalue 36(18) будут потребляются доками и торговыми станциями с максимальной скоростью, близкой к двукратной(однократной). То есть, потребление доками таких товаров - значительное. При уменьшении relvalue, потребление будет почти линейно уменьшаться до 1(1/2) кратного при relvalue 19(9), затем резко очень сильно уменьшится. При увеличении relvalue будет колебаться в районе 1(1/2) кратного.
Последний раз редактировалось: M_A_G (18:16 12-02-2008), всего редактировалось 3 раз(а) |
|
|
TechCat
100 EGP
 Репутация: 25 Сообщения: 328
Зарегистрирован: 20.02.2006
 |
|
Подскажите, пожалуйста, как работать с таблицами. Что означют функции типа SE_Table...?
|
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
WD : |
Подскажите, пожалуйста, как работать с таблицами. Что означют функции типа SE_Table...?
|
А ты где с ними собрался работать ?
А по функциям - эти функции реализованы вне обжа. Получить доступ к частичному описанию таких функций, можно зарегистрировавшись на сайте Эгософта и подписавшись на доступ к ДевНету.
добавлено спустя 2 минуты:
И на будущее.
В явном виде распространять материалы, не предназначенные Эгософтом для публичного использования - здесь не стоит.
То что раскопали сами - то раскопали.
_________________ Умножим энтропию на 0 :-)
Последний раз редактировалось: Chem (14:49 03-04-2008), всего редактировалось 1 раз |
|
|
Dark_
64 EGP
 Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008
 |
|
Chem
Что становится доступным при подписывании Эгософтовского NDA?
И напиши информацию о ДевНете в первом посте.
|
|
|
TechCat
100 EGP
 Репутация: 25 Сообщения: 328
Зарегистрирован: 20.02.2006
 |
|
Chem : |
А ты где с ними собрался работать ?
А по функциям - эти функции реализованы вне обжа. Получить доступ к частичному описанию таких функций, можно зарегистрировавшись на сайте Эгософта и подписавшись на доступ к ДевНету.
|
У меня есть помощь, но она на английском. Мне интересно, чем отличается структура vtable от array?
Самая загадочная функция - SE_TableNext. Используется очень часто в обжах. Я так и не смог преревести с английского её описание.
З.Ы. С остальными функциями уже всё понятно.
|
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Признаюсь - ступил
_________________ Умножим энтропию на 0 :-)
Последний раз редактировалось: Chem (22:01 03-04-2008), всего редактировалось 1 раз |
|
|
Dark_
64 EGP
 Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008
 |
|
Chem : |
возвращает - следующий элемент таблицы/массива. Если параметр 2 равен нулю - то возвращает первый элемент таблицы/массива.
|
При чём здесь вообще массив?? Функция работает только с таблицами. 0_о
Функция SE_TableNext(table, loc) принимает два аргумента
1 - идентификатор таблицы
2 - ключ из этой таблицы, относительно которого будет взят следующий элемент, или 0 если нужно получить ключ к первому элементу.
И функция возвращает ключ на элемент массива, т.е. если вызвали сначала
Код: |
loc1 = SE_TableNext(table, 0); |
то доступ к первому элементу таблицы осуществляется уже так:
Код: |
loc2 = table[loc1]; /* переменной loc2 присваивается значение первого элемента таблицы */ |
PS. Функция возвращает 0 в случае если таблица пуста или достигнуть её конец.
PSS. таблицы объявляются как .vtable и не являются линейными структурами как массивы.
PSSS. ключом может быть что угодно, даже обьекты.
|
|
|
TechCat
100 EGP
 Репутация: 25 Сообщения: 328
Зарегистрирован: 20.02.2006
 |
|
А возможна разбивка файла x3story на несколько частей, чтобы компилировать только ту часть, которую изменил?
Класс TREBUILD. Вот, что получилось.
Код: |
.classdef TREBUILD, 2071d ; 0817h
.vtable rb_ships//этим кораблям разрешено перестраеваться(создаёться при ScanGalaxyShips)
.vtable rb_rebuild//эти корабли ожидают очереди на перестройку
.vtable rb_tAstRebuild//эти астеройды ожидают очереди на перестройку
.vtable rb_tStationRebuild//эти станции ожидают очереди на перестройку
.func GetRebuildTable ; 000111F8h//возвращает rb_tStationRebuild
.func Init ; 00011206h//запускается после построения галактики(утсановка потока перестройки)
.func RequestRebuild ; 000114E8h//объект требует перестойки
.func ScanGalaxyShips ; 000119E6h//поиск кораблей, которые могут восстанавливаться
.func RebuildShip ; 00011C5Eh//Функция создает корабль в ближайшем секторе, где производят такие корабли, затем направляет корябль в сектор arg1
.func RebuildStation ; 000122C8h//Функция создает станции
.endclass TREBUILD
|
Перестоиться только кхаки, истребители ксенов и корабли класса Big. Гонеры, пираты и корабли игрока не перестраеваются.
Что бы перестроить астеройд или станцию нужно ->SetRebuild(1). Комплексы перестраеваться не будут.
Время ожидания после подачи заявки на перестойку:
корабли кхаков - 5-9 минут
другие корабли - 15-29 минут
станции - 6-24 часов
астеройды - 3-10 дней
Только когда пройдет это время объект пересториться.
Автоматически перестраевается астеройд после удаления, станция после уничтожения или при SelfDestruct, после захвата корабля или его уничтожения.
Огромные корабли(TSHIP_HUGE) не создаются в секторе с игроком, и появляются на станции, а не в секторе.
При постройки кхакских кораблей, мы сможем заметить эффект 46. Не кхакские корабли появляются в центре сектора, а расположение кхаков
Код: |
var loc6=arg1->GetSize();
loc2->SetPos(SE_Random(loc6/3)+loc6,SE_Random(loc6/3)+loc6,SE_Random(loc6/3)+loc6);
|
Тоесть вне радиуса сектора.
Последний раз редактировалось: TechCat (08:42 04-04-2008), всего редактировалось 1 раз |
|
|
Dark_
64 EGP
 Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008
 |
|
Расскажу маленькую сказочку почему нельзя производить операцию полной пересборки обжа
"DOBJ->XA2C->XC->XASM"
Жила была процедура TPLOT.CheckShipsOnPath(), никого не трогала,
а в ней после трепанации dobj'ом был код:
Код: |
001B627E: 004A | 6 if SP[0]<=SP[1] then push 0 else push 1
001B6280: 0033 000DB1A5 | 5 if SP[0]=0 then jump L001B6352
001B6286: 000B | 4 push 2
001B6288: 0005 0003 | 5 push SP[2] ; loc3
001B628C: 0008 | 6 get_from_array
001B628E: 000A | 5 push 1
001B6290: 003E | 6 add SP[0],SP[1]
001B6292: 000B | 5 push 2
001B6294: 0005 0004 | 6 push SP[3] ; loc3
001B6298: 002D | 7 put_to_array
001B629A: 000A | 5 push 1
001B629C: 003F | 6 sub SP[0],SP[1]
001B629E: 002C | 5 pop
001B62A0: 000B | 4 push 2
001B62A2: 0005 0003 | 5 push SP[2] ; loc3
001B62A6: 0008 | 6 get_from_array
001B62A8: 000A | 5 push 1
001B62AA: 0005 0004 | 6 push SP[3] ; loc3
001B62AE: 0008 | 7 get_from_array
001B62B0: 000A | 6 push 1
001B62B2: 005A 00000117 | 7 callasm SE_ArraySize ; 00000117 |
Вполне логичный код в котором делается примерно следующей
Код: |
if(<некое логическое выражение которое нам не итерсно>) {
{
(loc3[2]=loc3[2]+1)-1; // результат от -1 выкидывается, строчки asm
// 001B629A - 001B629E
// идёт if который выглядит примерно так:
if (SE_ArraySize(loc3[1]) > loc3[2]) { // впрочем if не важен. |
Теперь посмотрим на то что сгенерировал XA2C:
Код: |
if(<некое логическое выражение которое нам не итерсно>)
{
loc3[2]=loc3[2]+1-1; // вот здесь наступает пипец логике кода...
if(loc3[2]>=SE_ArraySize(loc3[1]))
{ |
XA2C каким то боком генерирует строчку "loc3[2]=loc3[2]+1-1;" которая не соотвествует асьмовому коду.
После тулы XC получим:
Код: |
push 2
push SP[2] ; <-- loc3
get_from_array
push 1
add SP[0],SP[1]
push 1
sub SP[0],SP[1]
push 2
push SP[3] ; <-- loc3
put_to_array
pop |
Т.е. тот самый кривой код сгенерёный XA2C.
В итоге после перекомпиляции получится обж со сдвинутой крышей...
WD : |
А возможна разбивка файла x3story на несколько частей,
|
Читай всю первою страницу этой темы
Есть в ХС такая директива #include
WD : |
чтобы компилировать только ту часть, которую изменил?
|
Писать патч на ams
Последний раз редактировалось: Dark_ (09:02 04-04-2008), всего редактировалось 2 раз(а) |
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Dark_ : |
Писать патч на ams
|
на asm т.е.
И наверное - все это в баг-репорты http://www.elite-games.ru/conference/viewtopic.php?t=36933.
_________________ Умножим энтропию на 0 :-) |
|
|
Dark_
64 EGP
 Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008
 |
|
Chem : |
И наверное - все это в баг-репорты
|
Толку мало ибо к сожалению, товарищ Darth Revan через пару дней будет "Lost in space"
|
|
|
AlexYar
1916 EGP
               Рейтинг канала: 13(2096) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
Dark_ : |
DOBJ->XA2C->XC->XASM
|
Какую версию ха2с используешь? С каким параметром запускаешь?
В старой версии был такой баг.
Dark_ : |
WD : |
чтобы компилировать только ту часть, которую изменил?
|
Писать патч на ams
|
Можно и на СХ
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(99) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
AlexYar : |
Какую версию ха2с используешь? С каким параметром запускаешь?
|
Проверил в XA2C версии 1.02, параметры не влияют.
Неприятный момент.
Последний раз редактировалось: CheckerTwo (15:54 04-04-2008), всего редактировалось 1 раз |
|
|
Dark_
64 EGP
 Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008
 |
|
AlexYar : |
Какую версию ха2с используешь? С каким параметром запускаешь?
|
1.02 альфа
От параметров не зависит
CheckerTwo : |
Неприятный момент
|
А фиксить надо...
|
|
|
AlexYar
1916 EGP
               Рейтинг канала: 13(2096) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
А в 1.01 данный баг есть?
добавлено спустя 5 минут:
Одно радует - данный вариант кода не имеет смысла (единица от воздуха отнимается), и так как в коде таких мест немного, то их можно быстро поиском найти и руками поправить
Последний раз редактировалось: AlexYar (16:46 05-04-2008), всего редактировалось 1 раз |
|
|
AlexYar
1916 EGP
               Рейтинг канала: 13(2096) Репутация: 325 Сообщения: 32758
Зарегистрирован: 26.10.2003
 |
|
Dark_ : |
И функция возвращает ключ на элемент массива, т.е. если вызвали сначала
Код:
loc1 = SE_TableNext(table, 0);
то доступ к первому элементу таблицы осуществляется уже так:
|
А как тогда объяснишь работу такого кода?
Код: |
for(loc1=SE_TableNext(TSECTOR.sec_Suns);loc1;loc1=SE_TableNext(TSECTOR.sec_Suns,loc1))
{
loc1->Activate();
}
|
По-твоему, в данном случае активируется ключ на солнце, а не само солнце?
Я понимаю, что в данной таблице ключ на объект одновременно является и объектом в таблице по этому ключу, но твоё определение в данном примере может привести к путанице
|
|
|
Dark_
64 EGP
 Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008
 |
|
Я себя процентную
Смотри PSSS.
Dark_ : |
PS. Функция возвращает 0 в случае если таблица пуста или достигнуть её конец.
PSS. таблицы объявляются как .vtable и не являются линейными структурами как массивы.
PSSS. ключом может быть что угодно, даже обьекты.
|
А вот вызов без второго аргумента заметил только сейчас...
|
|
|
|
|
|
Канал X3: Reunion ->
Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы» |
|
|