Elite Games - Свобода среди звезд!
.
  » Кодинг в обже, вопросы и ответы | страница 1
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Снег | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 1 из 7
На страницу: 1, 2, 3, 4, 5, 6, 7  След. | Все страницы
Поиск в этой теме:
Канал X3: Reunion » Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы»
Chem
 780 EGP


Скрипт-мастер
Рейтинг канала: 15(2604)
Репутация: 248
Сообщения: 4751
Откуда: Киев
Зарегистрирован: 08.01.2007
Тема создана именно для обмена опытом по внутренностям Х3. Точнее - обжи и возможно ехе.
Для обсуждения новых команд скрипт-редактора - есть отдельная тема Добавляем новые команды в скрипт редактор Подмигиваю.
Для модификации - Армагеддон - тоже Подмигиваю.

Пока не предусматривается обсуждать в этой теме - переделки обжей. Только обмен опытом. Очень многие данные о логике работы игры были вытащены из ее внутренностей Подмигиваю.

Значить так - как получить читаемый текст обжа:

  1. Достаем последний обж - из 09.cat/dat, из папки L, имя файла - x3story.obj.
  2. Идем в тему X2-ASM - это проcто!, и качаем дизассемблер, ну и на всякий случай - ассемблер. Подмигиваю
  3. Меняем значение в dobj.ini, с OutFmt = HEX на OutFmt = DEC. Так же предлагаю заменить секцию [Class_X3], на предложенный мною вариант именования классов игровых объектов.
  4. Запускаем dobj.exe x3story.obj.
  5. На этом знатоки ассемблера могут остановиться и читать полученный ассемблерный код.
    Замечание: Если файл x3story.err состоит только из записей вида "Error: Overflow stack at command addr = 00005670; stack = 1 limit = 0", то это нормально
  6. Далее идем в тему Трансляторы XC->XASM и XASM->XC, и качаем файлы xa2c.rar и xc.rar, последних версий.
  7. Запускаем 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.
  8. Можно приступать к гаданию на внутренностях Х3.

Если вы таки хотите что-то подправить в полученном коде, и сделать обж, и поиграть с ним Подмигиваю, то

  1. На полученный x3story.cpp напускаете xc.exe, т.е. выполняете xc.exe x3story.cpp (в папке с ними должен находиться x3story.h), предварительно исправив параметр с GenerateEnd = 0 на GenerateEnd = 1.
  2. Потом подправляете секцию [Class_X3] в файле xa_asm.ini, аналогично сделанному в dobj.ini. Так же исправляем с TypeName = HEX на TypeName = DEC
  3. потом на полученный x3story.inc напускаем xa_asm.exe, т.е. выполняем xa_asm.exe x3story.inc. И если нет ошибок, то переименовываем x3story.cod в x3story.obj.
  4. Запаковываем 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
 Скачано:  553 раз(а)
xc2obj-conf.7z
 Описание:
x3story_cpp_to_obj.cmd - запуск сборки
xa_asm.ini - конфигурация для ассемблера
xc.ini - для xc
 Имя файла:  xc2obj-conf.7z
 Размер файла:  6.27 KB
 Скачано:  523 раз(а)

_________________
Умножим энтропию на 0 :-)

Последний раз редактировалось: Gannibal (21:18 27-04-2011), всего редактировалось 1 раз
Последний раз редактировалось: Chem (17:47 03-04-2008), всего редактировалось 10 раз(а)
    Добавлено: 20:38 23-01-2008   
Chem
 780 EGP


Скрипт-мастер
Рейтинг канала: 15(2604)
Репутация: 248
Сообщения: 4751
Откуда: Киев
Зарегистрирован: 08.01.2007
Предлагаемая структура секции Class_X3 для файла dobj.ini. X3store.obj - из версии 2.5 (или 2.0.02, т.к. описание лишнего количества типов данніх никому не вредит.
Код классаИдентификатор классаРодительский классОписание класса
1TX_AUDIO
2TINIT
2000TGALAXY
2001TSECTOR
2002TPLANET
2003TRACETRACEBASE
2004TSHIPTSCRIPT
2005TRACEBASE
2006TFACTORYTSTATION
2007TDOCKTSTATION
2008TSUN
2009TPLAYER
2010TCUSTOM_GALOBJTGBODY
2011TLASERTOWERTSHIP_STATIONARY
2012TASTEROIDTGBODY
2014TGATETGBODY
2015TPIRATESTRACE
2016TSTATIONTSCRIPT
2017TGONERTRACE
2018TSPECIALTGBODY
2019TSHIP_HUGETSHIP_CARRIER
2021TSHIP_M1TSHIP_HUGE
2022TSHIP_M2TSHIP_HUGE
2023TSHIP_M3TSHIP_FIGHTER
2024TSHIP_M4TSHIP_FIGHTER
2025TSHIP_M5TSHIP_FIGHTER
2026TSHIP_M6TSHIP_CARRIER
2027TSHIP_M7TSHIP_CARRIER
2030TSHIP_TPTSHIP_TS
2031TSHIP_TSTSHIP_LITTLE
2032TSHIP_TLTSHIP_HUGE
2033TSHIP_CARRIERTSHIP_BIG
2034TSHIP_FIGHTERTSHIP_LITTLE
2035TSHIP_TS_PIRATETSHIP_TS
2037TSHIPYARDTFACTORY
2038TSHIP_SPEAKERTSHIP
2039TSHIP_GONERTSHIP_LITTLE
2042TDOCK_GONERTDOCK
2043TNEBULA
2044TCOMPLEXTFACTORY
2045TCOMPLEX_HQTCOMPLEX
2046THEAD_QUARTERTDOCK
2050TGBODY
2060TBEACONTSATELLITECLASS
2061TDRONE_BASE_CLASSTSHIP_LITTLE
2064TSHIP_ASTRONAUTTSHIP_SPECIAL
2065TSATELLITETSATELLITECLASS
2066TMINETSHIP_STATIONARY
2067TFIGHTDRONETDRONE_BASE_CLASS
2068TSHIP_UFOTSHIP_SPECIAL
2069TGLOBAL_SCRIPT_MAP
2070TSPACEFLYTSHIP_SPECIAL
2071TREBUILD
2072TSHIELD_RELOADER
2073TSHIP_BIGTSHIP_MOVEABLE
2074TDOCK_TRADETDOCK
2075TDOCK_EQUIPMENTTDOCK
2076TDOCK_PIRATEBASETDOCK
2078TDOCK_KHAAKTDOCK
2079TSATELLITECLASSTSHIP_STATIONARY
2080TADVANCEDSATELLITETSATELLITE
2081TSHIPYARD_SMALLTSHIPYARD
2082TSHIPYARD_BIGTSHIPYARD
2084TCRATE_FLYINGWARETGBODY
2085TMISSILETGBODY
2087THULL_RELOADER
2088TDEBRISTGBODY
2089TDEBRIS_CREATOR
2090TWRECKTGBODY
2091TWRECK_CREATOR
2092TFREIGHTDRONETDRONE_BASE_CLASS
2100TCLIENT
2115TGAMEOVER
2116TBUILD_FACTORY
2119TPATCH
2120TSCRIPT_EDITOR
2121TSCRIPT_UPDATE
2122TPLAY_CUTSCENES
2123TCAMERA
2124TSCRIPTTGBODY
2125TMONITOR
2126TMONITORCONTROL
2127TAL_PLUGINS
2128TGODENGINE
2129TTRADEMASTER
2130TSCENE3D
2131TSHIP_KHAAKCLUSTERTSHIP_M3
2132TOBJ_KHAAKTRACE
2133TSHIP_LITTLETSHIP_MOVEABLE
2134TSHIP_MOVEABLETSHIP
2135TSHIP_STATIONARYTSHIP
2136TSHIP_SPECIALTSHIP
2140TSHIP_M5_RACINGTSHIP_M5
2141TNAV_POINTTSPECIAL
2142TJOB_MAP
2150TMD_CUE
2151TMISSION_DIRECTORTMD_CUE
2200TMENU
2201TMENU_BACKGROUND
2210TMENU_IDTMENU
2211TMENU_SHIPTMENU_ID
2212TMENU_STATION_FABRICTMENU_STATION
2213TMENU_STATION_DOCKTMENU_STATION
2214TMENU_PLAYERTMENU_ID
2216TMENU_SECTORTMENU
2217TMENU_TRADETMENU_TRADE_BASIC
2222TMENU_WARETMENU_ID
2223TMENU_ASTEROIDTMENU_ID
2224TMENU_WARPGATETMENU_ID
2225TMENU_DIALOGTMENU_ID
2226TMENU_LOADSAVETMENU_ID
2228TMENU_GALAXYTMENU
2229TMENU_SHIPINFOTMENU_ID
2230TMENU_SHIPLISTTMENU
2231TMENU_STATIONTMENU_ID
2232TMENU_SHIPLIST_CARRIEDTMENU_SHIPLIST
2233TMENU_SHIPLIST_OWNEDTMENU_SHIPLIST
2235TMENU_MAINTMENU_ID
2236TMENU_WEAPONSTMENU_ID
2243TMENU_STATIONINFOTMENU_ID
2245TMENU_BIGTEXTTMENU_ID
2246TMENU_BIGTEXT_EXTTMENU_BIGTEXT
2249TMENU_SELECTWARETMENU_ID
2251TMENU_PLAYEROWNEDTMENU_BIGTEXT_EXT
2252TMENU_INPUTSTRINGTMENU_ID
2253TMENU_FREIGHTBAYTMENU_TRADE_BASIC
2256TMENU_CHANGESHIPTMENU_SHIPLIST
2257TMENU_UFOINFOTMENU_SHIP
2258TMENU_ASTRONAUTTMENU_SHIP
2259TMENU_OPTIONSTMENU_ID
2261TMENU_CHANGENAME_PLAYERTMENU_INPUTSTRING
2262TMENU_LOGENTRYTMENU_INPUTSTRING
2263TMENU_UPGRADESHIPSTMENU_TRADE
2264TMENU_TRADE_BASICTMENU_ID
2265TMENU_CHANGENAME_OBJECTTMENU_INPUTSTRING
2266TMENU_FREIGHTEXCHANGETMENU_TRADE_BASIC
2267TMENU_JUMPDRIVETMENU_ID
2268TMENU_TRADEUTILITIESTMENU_BIGTEXT
2269TMENU_LOAD_TLTMENU_ID
2270TMENU_UNLOAD_TLTMENU_ID
2271TMENU_SCETMENU_BIGTEXT_EXT
2272TMENU_SCE_INPUTTMENU_INPUTSTRING
2273TMENU_SCRIPT_INPUTTMENU_ID
2274TMENU_SCRIPT_EXECUTETMENU_BIGTEXT
2275TMENU_SCRIPT_SELECTTMENU_ID
2276TMENU_ASKTMENU_ID
2277TMENU_QUESTIONTMENU_ASK
2278TMENU_COMMANDTMENU_ID
2279TMENU_TRADE_EXTTMENU_TRADE
2287TMENU_RECORDINGTMENU_INPUTSTRING
2288TMENU_BBSTMENU_BIGTEXT_EXT
2289TMENU_MESSAGESTMENU_BIGTEXT
2290TMENU_SCRIPT_DEBUGTMENU_BIGTEXT_EXT
2291TMENU_SCRIPT_GLOBALTASKTMENU_BIGTEXT_EXT
2292TMENU_PLUGINTMENU_BIGTEXT
2293TMENU_COMMANDINFOTMENU_ID
2294TMENU_MERCHANTTMENU_BIGTEXT
2295TMENU_MERCHANTINFOTMENU_ID
2296TMENU_CONTROLSTMENU_BIGTEXT
2297TMENU_MISSIONLOGTMENU
2299TMENU_CHANGENAME_FORMATIONTMENU_INPUTSTRING
2300TINPUT_CONTROL
2301TQUEST_SHIP_CONTROLS
2302TMENU_INTERACTIVE_ASSISTANCE_SSYSTEMTMENU_ID
2303TMENU_COMPLEX_INFOTMENU_STATIONINFO
2304TMENU_HEAD_QUARTER_INFOTMENU_STATIONINFO
2305TMENU_HEAD_QUARTERTMENU_ID
2306TMENU_MISSION_DIRECTORTMENU_ID
2400TMENU_KEYS
2401TMERCHANT
2402TQUICKMENU
2403TQUICKMENU_PLAYER_SPACETQUICKMENU
2404TQUICKMENU_PLAYER_STATIONTQUICKMENU
2405TQUICKMENU_PLAYER_NAVIGATIONTQUICKMENU
2406TQUICKMENU_PLAYER_PILOTTQUICKMENU
2407TQUICKMENU_PLAYER_PERSONALTQUICKMENU
2408TQUICKMENU_PLAYER_STATION_SUB_STATIONTQUICKMENU
2409TQUICKMENU_PLAYER_ASSETSTQUICKMENU
2410TQUICKMENU_ACTION_SHIPTQUICKMENU
2411TQUICKMENU_ACTION_STATIONTQUICKMENU
2412TQUICKMENU_ACTION_FWARE_WRECKTQUICKMENU
2413TQUICKMENU_ACTION_ASTEROID_DEBRIS_GATETQUICKMENU
2420TQUICKMENU_MAINTQUICKMENU
2421TQUICKMENU_LOAD_SAVE_LISTTQUICKMENU
2422TQUICKMENU_LOADTQUICKMENU_LOAD_SAVE_LIST
2423TQUICKMENU_SAVETQUICKMENU_LOAD_SAVE_LIST
2424TQUICKMENU_CONFIRMTQUICKMENU
2430TQUICKMENU_SHIP_GROUPSTQUICKMENU
2431TQUICKMENU_MANAGE_SHIP_GROUPTQUICKMENU
2432TQUICKMENU_SHIPS_IN_GROUPTQUICKMENU
2500TPLAYER_INFO
2600TGAME_TIP
2601TMENU_WINDOW
2700TICON_MENU
2701TICON_MAILTICON_MENU
2702TICON_COCPITTICON_MENU
2703TICON_WEAPONTICON_MENU
2721TICON_MENU_SELECTEDTICON_MENU
3001TQUESTMASTER
3003TPLOTTQUESTMASTER_QUESTS_BASIC
3100TQUEST
3101TQUESTMASTER_QUESTS_BASICTQUEST
4158TQUEST158TQUESTMASTER_QUESTS_BASIC
4172TQUEST172_PIRATE_TRANSPORT_P1235TQUESTMASTER_QUESTS_BASIC
4190TQUEST190_HITCHHIKER_P1290TQUESTMASTER_QUESTS_BASIC
4193TQUEST193_GENERIC_TRADING_1_P1293TQUESTMASTER_QUESTS_BASIC
4194TQUEST194_BBS_NEWS_ENGINE_P1294TQUESTMASTER_QUESTS_BASIC
4214TQUEST214_BBS_TOURBUS_P1314TQUESTMASTER_QUESTS_BASIC
4216TQUEST216_BBS_ASSASINATION_P1316TQUESTMASTER_QUESTS_BASIC
4217TQUEST217_BBS_TAXI_P1317TQUESTMASTER_QUESTS_BASIC
4219TQUEST219_BUY_SECTOR_MAP_P1319TQUESTMASTER_QUESTS_BASIC
4223TQ223_PLOT3_P301323TPLOT
4224TQ224_PLOT4_P301324TPLOT
4225TQ225_PLOT5_P301325TPLOT
4226TQ226_PLOT6_P301326TPLOT
4227TQ227_PLOT7_P301327TPLOT
4228TQ228_PLOT8_P301328TPLOT
4235TQUEST235_MIRIAS_BBS_ENTRY_P301335TQUESTMASTER_QUESTS_BASIC
4263TQUEST263_GENERIC_TRADING_B_P1363TQUESTMASTER_QUESTS_BASIC
4267TQUEST267_BBS_LOTTERY_GAME_P1367TQUESTMASTER_QUESTS_BASIC
4268TQUEST268_BBS_BLACK_JACK_P301368TQUESTMASTER_QUESTS_BASIC
4269TQUEST269_BBS_PIRATE_HACKERS_P1369TQUESTMASTER_QUESTS_BASIC
4270TQUEST270_BBS_BUY_KHAAK_SECTOR_COORDS_P1370TQUESTMASTER_QUESTS_BASIC
4271TQUEST271_BBS_BUY_KHAAK_SPECS_P1371TQUESTMASTER_QUESTS_BASIC
4275TQUEST275_XENON_INVASION_P1375TQUESTMASTER_QUESTS_BASIC
4281TQUEST281_STATION_REPAIR_II_P1381TQUESTMASTER_QUESTS_BASIC
4289TQUEST289_SCRIPT_MESSAGE_HANDLER_P301389TQUESTMASTER_QUESTS_BASIC
4290TQUEST290_EMPTY_P1390TQUESTMASTER_QUESTS_BASIC
4291TQUEST291_BBS_GONER_PREACHING_P301391TQUESTMASTER_QUESTS_BASIC
4293TQUEST293_SCRIPT_QUEST_P301393TQUESTMASTER_QUESTS_BASIC
4299TQUEST299_RACING_QUEST_P301399TQUESTMASTER_QUESTS_BASIC
4300TQUEST300_SECTOR_AUCTION_QUEST_P301400TQUESTMASTER_QUESTS_BASIC
4301TQUEST301_SECTOR_AUCTION_BBS_REPORTS_P301401TQUESTMASTER_QUESTS_BASIC
4302TQUEST302_EMPTY_P1402TQUESTMASTER_QUESTS_BASIC
4303TQUEST303_SOFT_SIGN_SCRAMBLER_P301403TQUESTMASTER_QUESTS_BASIC
4304TQUEST304_SECTOR_AUCTION_QUEST_V2_P301404TQUESTMASTER_QUESTS_BASIC
4305TQUEST305_SECTOR_AUCTION_BBS_REPORTS_V2_P301405TQUESTMASTER_QUESTS_BASIC
4306TQUEST306_BBS_RACING_HANDLER_P301406TQUESTMASTER_QUESTS_BASIC
4307TQUEST307_BALA_GI_HQ_MISSION_P301407TQUESTMASTER_QUESTS_BASIC
4314TQUEST314_CHECK_START_POSTQUESTMASTER_QUESTS_BASIC
4316TQUEST316_BBS_QUEST_TREASURE_HUNT_P304316TQUESTMASTER_QUESTS_BASIC
4317TQUEST317_BBS_QUEST_DONATION_P3043317TQUESTMASTER_QUESTS_BASIC
4320TQUEST320_EMPTY_P1420TQUESTMASTER_QUESTS_BASIC
4322TQUEST322_BBS_PIRATES_CRATE_P301422TQUESTMASTER_QUESTS_BASIC
4323TQUEST323_BBS_QUEST_BLACKMAIL_P301422TQUESTMASTER_QUESTS_BASIC
4324TQUEST324_SECTOR_AUCTION_QUEST_V2_P1424TQUESTMASTER_QUESTS_BASIC
5000TUPGRADEMASTER
5001TUPGRADE
5003TUPGRADE1_DOCKING_COMPUTERTUPGRADE
5004TUPGRADE2_BEST_SELLING_PRICE_LOCATORTUPGRADE
5005TUPGRADE3_TRANSPORTER_DEVICETUPGRADE
5006TUPGRADE4_JUMPDRIVETUPGRADE
5008TUPGRADE6_BEST_BUYS_LOCATORTUPGRADE
5012TUPGRADE10_STRAFE_DRIVE_EXTENSIONTUPGRADE
5013TUPGRADE11_CARGO_LIFESUPPORT_SYSTEMTUPGRADE
5014TUPGRADE12_BOOST_EXTENSIONTUPGRADE
5015TUPGRADE13_NAVIGATION_RELAY_SATELLITETUPGRADE
5016TUPGRADE14_SQUASH_MINETUPGRADE
5017TUPGRADE15_LASERTOWERTUPGRADE
5018TUPGRADE16_FIGHTDRONETUPGRADE
5019TUPGRADE17_FREIGHTDRONETUPGRADE
5035TUPGRADE33_ADVANCEDSATELLITETUPGRADE
5038TUPGRADE36_ORE_COLLECTORTUPGRADE
5043TUPGRADE41_SPACEFLYCOLLECTORTUPGRADE
6000TEVENT
6001TEVENT_6001TEVENT
6002TEVENT_KHAAK_INVASIONTEVENT
6003TEVENT_P2203TEVENT
6004TEVENT_STATION_DESTRUCTIONTEVENT
6005TEVENT_ATTACK_P2202TEVENT
8047TRANDOMNPC_PACK
8048TRANDOMNPC_SHIP
8060TX3_PLOT_SHIP_M5TSHIP_M5
8061TX3_PLOT_SHIP_TLTSHIP_TL
8070TX3_PLOT_SHIP_M3TSHIP_M3
8071TX3_PLOT_SHIP_M4TSHIP_M4
8072TX3_PLOT_SHIP_M6TSHIP_M6
8073TX3_PLOT_SHIP_TPTSHIP_TP
8074TX3_PLOT_SHIP_TSTSHIP_TS
8075TX3_PLOT_SHIP_GONERTSHIP_GONER
8076TX3_PLOT_SHIP_TL_2TSHIP_TL
8077TX3_PLOT_SHIP_TP_2TSHIP_TP
8078TX3_PLOT_SHIP_M6_2TSHIP_M6
8079TX3_PLOT_OBJECTS
8080TWAYPOINT
8081TCRATE_XENONCONTAINERTCRATE_FLYINGWARE
8082TX3_PLOT_SPECIALTSPECIAL
8083TX3_PLOT_SHIPTSHIP
8084TX3_PLOT_OBJECTS_SPEAKERTSHIP_SPEAKER
8085TX3_PLOT_MARANI_STATIONTSHIPYARD_BIG
8086TX3_PLOT_YAKI_STATIONTFACTORY
8087TX3_PLOT_SPY_DRONETSHIP_M5
8088TX3_PLOT_MINETMINE

_________________
Умножим энтропию на 0 :-)

Последний раз редактировалось: Chem (17:38 03-04-2008), всего редактировалось 5 раз(а)
    Добавлено: 20:42 23-01-2008   
Chem
 780 EGP


Скрипт-мастер
Рейтинг канала: 15(2604)
Репутация: 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 раз
    Добавлено: 01:58 26-01-2008   
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 раз(а)
    Добавлено: 23:42 10-02-2008   
TechCat
 90 EGP

Репутация: 25
Сообщения: 322

Зарегистрирован: 20.02.2006
Подскажите, пожалуйста, как работать с таблицами. Что означют функции типа SE_Table...?
    Добавлено: 14:23 03-04-2008   
Chem
 780 EGP


Скрипт-мастер
Рейтинг канала: 15(2604)
Репутация: 248
Сообщения: 4751
Откуда: Киев
Зарегистрирован: 08.01.2007
WD :
Подскажите, пожалуйста, как работать с таблицами. Что означют функции типа SE_Table...?

А ты где с ними собрался работать ?
А по функциям - эти функции реализованы вне обжа. Получить доступ к частичному описанию таких функций, можно зарегистрировавшись на сайте Эгософта и подписавшись на доступ к ДевНету.

добавлено спустя 2 минуты:
И на будущее.
В явном виде распространять материалы, не предназначенные Эгософтом для публичного использования - здесь не стоит.
То что раскопали сами - то раскопали.
_________________
Умножим энтропию на 0 :-)

Последний раз редактировалось: Chem (14:49 03-04-2008), всего редактировалось 1 раз
    Добавлено: 14:49 03-04-2008   
Dark_
 64 EGP

Рейтинг канала: 5(201)
Репутация: 7
Сообщения: 58
Откуда: за вторым поворотом
Зарегистрирован: 18.03.2008
Chem
Что становится доступным при подписывании Эгософтовского NDA?
И напиши информацию о ДевНете в первом посте.
    Добавлено: 15:38 03-04-2008   
TechCat
 90 EGP

Репутация: 25
Сообщения: 322

Зарегистрирован: 20.02.2006
Chem :

А ты где с ними собрался работать ?
А по функциям - эти функции реализованы вне обжа. Получить доступ к частичному описанию таких функций, можно зарегистрировавшись на сайте Эгософта и подписавшись на доступ к ДевНету.


У меня есть помощь, но она на английском. Мне интересно, чем отличается структура vtable от array?

Самая загадочная функция - SE_TableNext. Используется очень часто в обжах. Я так и не смог преревести с английского её описание.

З.Ы. С остальными функциями уже всё понятно.
    Добавлено: 17:23 03-04-2008   
Chem
 780 EGP


Скрипт-мастер
Рейтинг канала: 15(2604)
Репутация: 248
Сообщения: 4751
Откуда: Киев
Зарегистрирован: 08.01.2007
Признаюсь - ступил Подмигиваю
_________________
Умножим энтропию на 0 :-)

Последний раз редактировалось: Chem (22:01 03-04-2008), всего редактировалось 1 раз
    Добавлено: 18:17 03-04-2008   
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. ключом может быть что угодно, даже обьекты.
    Добавлено: 21:00 03-04-2008   
TechCat
 90 EGP

Репутация: 25
Сообщения: 322

Зарегистрирован: 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 раз
    Добавлено: 06:10 04-04-2008   
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 раз(а)
    Добавлено: 08:41 04-04-2008   
Chem
 780 EGP


Скрипт-мастер
Рейтинг канала: 15(2604)
Репутация: 248
Сообщения: 4751
Откуда: Киев
Зарегистрирован: 08.01.2007
Dark_ :
Писать патч на ams

на asm т.е.
И наверное - все это в баг-репорты http://www.elite-games.ru/conference/viewtopic.php?t=36933.
_________________
Умножим энтропию на 0 :-)
    Добавлено: 09:16 04-04-2008   
Dark_
 64 EGP

Рейтинг канала: 5(201)
Репутация: 7
Сообщения: 58
Откуда: за вторым поворотом
Зарегистрирован: 18.03.2008
Chem :
И наверное - все это в баг-репорты

Толку мало ибо к сожалению, товарищ Darth Revan через пару дней будет "Lost in space"
    Добавлено: 10:56 04-04-2008   
AlexYar
 1615 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25236

Зарегистрирован: 26.10.2003
Dark_ :
DOBJ->XA2C->XC->XASM


Какую версию ха2с используешь? С каким параметром запускаешь?

В старой версии был такой баг.

Dark_ :
WD :
чтобы компилировать только ту часть, которую изменил?


Писать патч на ams


Можно и на СХ Гы-гы
    Добавлено: 11:04 04-04-2008   
CheckerTwo
 550 EGP


Рейтинг канала: 4(99)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
Какую версию ха2с используешь? С каким параметром запускаешь?

Проверил в XA2C версии 1.02, параметры не влияют.
Неприятный момент. Расстроен

Последний раз редактировалось: CheckerTwo (15:54 04-04-2008), всего редактировалось 1 раз
    Добавлено: 15:52 04-04-2008   
Dark_
 64 EGP

Рейтинг канала: 5(201)
Репутация: 7
Сообщения: 58
Откуда: за вторым поворотом
Зарегистрирован: 18.03.2008
AlexYar :

Какую версию ха2с используешь? С каким параметром запускаешь?

1.02 альфа
От параметров не зависит

CheckerTwo :
Неприятный момент

А фиксить надо...
    Добавлено: 16:00 04-04-2008   
AlexYar
 1615 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25236

Зарегистрирован: 26.10.2003
А в 1.01 данный баг есть?

добавлено спустя 5 минут:
Одно радует - данный вариант кода не имеет смысла (единица от воздуха отнимается), и так как в коде таких мест немного, то их можно быстро поиском найти и руками поправить Улыбка

Последний раз редактировалось: AlexYar (16:46 05-04-2008), всего редактировалось 1 раз
    Добавлено: 16:46 05-04-2008   
AlexYar
 1615 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25236

Зарегистрирован: 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();
  }


По-твоему, в данном случае активируется ключ на солнце, а не само солнце? Гы-гы

Я понимаю, что в данной таблице ключ на объект одновременно является и объектом в таблице по этому ключу, но твоё определение в данном примере может привести к путанице Улыбка
    Добавлено: 17:49 07-04-2008   
Dark_
 64 EGP

Рейтинг канала: 5(201)
Репутация: 7
Сообщения: 58
Откуда: за вторым поворотом
Зарегистрирован: 18.03.2008
Я себя процентную Улыбка
Смотри PSSS. Улыбка
Dark_ :

PS. Функция возвращает 0 в случае если таблица пуста или достигнуть её конец.
PSS. таблицы объявляются как .vtable и не являются линейными структурами как массивы.
PSSS. ключом может быть что угодно, даже обьекты.


А вот вызов без второго аргумента заметил только сейчас...
    Добавлено: 18:02 07-04-2008   
Канал X3: Reunion -> Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы»
На страницу: 1, 2, 3, 4, 5, 6, 7  След. | Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Модер - профессиональный флудератор, волею судьбы призванный давить бывших соратников. (027)

  » Кодинг в обже, вопросы и ответы | страница 1
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18