status.c 151 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115
  1. // ステータス計算、状態異常処理
  2. #include <time.h>
  3. #include <ctype.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <memory.h>
  7. #include "pc.h"
  8. #include "map.h"
  9. #include "pet.h"
  10. #include "mob.h"
  11. #include "clif.h"
  12. #include "guild.h"
  13. #include "skill.h"
  14. #include "itemdb.h"
  15. #include "battle.h"
  16. #include "chrif.h"
  17. #include "status.h"
  18. #include "timer.h"
  19. #include "nullpo.h"
  20. #include "script.h"
  21. #include "showmsg.h"
  22. /* スキル番?=>ステ?タス異常番??換テ?ブル */
  23. int SkillStatusChangeTable[]={ /* status.hのenumのSC_***とあわせること */
  24. /* 0- */
  25. -1,-1,-1,-1,-1,-1,
  26. SC_PROVOKE, /* プロボック */
  27. -1, 1,-1,
  28. /* 10- */
  29. SC_SIGHT, /* サイト */
  30. -1,-1,-1,-1,
  31. SC_FREEZE, /* フロストダイバ? */
  32. SC_STONE, /* スト?ンカ?ス */
  33. -1,-1,-1,
  34. /* 20- */
  35. -1,-1,-1,-1,
  36. SC_RUWACH, /* ルアフ */
  37. -1,-1,-1,-1,
  38. SC_INCREASEAGI, /* 速度?加 */
  39. /* 30- */
  40. SC_DECREASEAGI, /* 速度減少 */
  41. -1,
  42. SC_SIGNUMCRUCIS, /* シグナムクルシス */
  43. SC_ANGELUS, /* エンジェラス */
  44. SC_BLESSING, /* ブレッシング */
  45. -1,-1,-1,-1,-1,
  46. /* 40- */
  47. -1,-1,-1,-1,-1,
  48. SC_CONCENTRATE, /* 集中力向上 */
  49. -1,-1,-1,-1,
  50. /* 50- */
  51. -1,
  52. SC_HIDING, /* ハイディング */
  53. -1,-1,-1,-1,-1,-1,-1,-1,
  54. /* 60- */
  55. SC_TWOHANDQUICKEN, /* 2HQ */
  56. SC_AUTOCOUNTER,
  57. -1,-1,-1,-1,
  58. SC_IMPOSITIO, /* インポシティオマヌス */
  59. SC_SUFFRAGIUM, /* サフラギウム */
  60. SC_ASPERSIO, /* アスペルシオ */
  61. SC_BENEDICTIO, /* 聖?降福 */
  62. /* 70- */
  63. -1,
  64. SC_SLOWPOISON,
  65. -1,
  66. SC_KYRIE, /* キリエエレイソン */
  67. SC_MAGNIFICAT, /* マグニフィカ?ト */
  68. SC_GLORIA, /* グロリア */
  69. SC_DIVINA, /* レックスディビ?ナ */
  70. -1,
  71. SC_AETERNA, /* レックスエ?テルナ */
  72. -1,
  73. /* 80- */
  74. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  75. /* 90- */
  76. -1,-1,
  77. SC_QUAGMIRE, /* クァグマイア */
  78. -1,-1,-1,-1,-1,-1,-1,
  79. /* 100- */
  80. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  81. /* 110- */
  82. -1,
  83. SC_ADRENALINE, /* アドレナリンラッシュ */
  84. SC_WEAPONPERFECTION,/* ウェポンパ?フェクション */
  85. SC_OVERTHRUST, /* オ?バ?トラスト */
  86. SC_MAXIMIZEPOWER, /* マキシマイズパワ? */
  87. -1,-1,-1,-1,-1,
  88. /* 120- */
  89. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  90. /* 130- */
  91. -1,-1,-1,-1,-1,
  92. SC_CLOAKING, /* クロ?キング */
  93. SC_STAN, /* ソニックブロ? */
  94. -1,
  95. SC_ENCPOISON, /* エンチャントポイズン */
  96. SC_POISONREACT, /* ポイズンリアクト */
  97. /* 140- */
  98. SC_POISON, /* ベノムダスト */
  99. SC_SPLASHER, /* ベナムスプラッシャ? */
  100. -1,
  101. SC_TRICKDEAD, /* 死んだふり */
  102. -1,-1,SC_AUTOBERSERK,-1,-1,-1,
  103. /* 150- */
  104. -1,-1,-1,-1,-1,
  105. SC_LOUD, /* ラウドボイス */
  106. -1,
  107. SC_ENERGYCOAT, /* エナジ?コ?ト */
  108. -1,-1,
  109. /* 160- */
  110. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  111. -1,-1,-1,
  112. SC_SELFDESTRUCTION,
  113. -1,-1,-1,-1,-1,-1,
  114. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  115. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  116. -1,
  117. SC_KEEPING,
  118. -1,-1,
  119. SC_BARRIER,
  120. -1,-1,
  121. SC_HALLUCINATION,
  122. -1,-1,
  123. /* 210- */
  124. -1,-1,-1,-1,-1,
  125. SC_STRIPWEAPON,
  126. SC_STRIPSHIELD,
  127. SC_STRIPARMOR,
  128. SC_STRIPHELM,
  129. -1,
  130. /* 220- */
  131. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  132. /* 230- */
  133. -1,-1,-1,-1,
  134. SC_CP_WEAPON,
  135. SC_CP_SHIELD,
  136. SC_CP_ARMOR,
  137. SC_CP_HELM,
  138. -1,-1,
  139. /* 240- */
  140. -1,-1,-1,-1,-1,-1,-1,-1,-1,
  141. SC_AUTOGUARD,
  142. /* 250- */
  143. -1,-1,
  144. SC_REFLECTSHIELD,
  145. -1,-1,
  146. SC_DEVOTION,
  147. SC_PROVIDENCE,
  148. SC_DEFENDER,
  149. SC_SPEARSQUICKEN,
  150. -1,
  151. /* 260- */
  152. -1,-1,-1,-1,-1,-1,-1,-1,
  153. SC_STEELBODY,
  154. SC_BLADESTOP_WAIT,
  155. /* 270- */
  156. SC_EXPLOSIONSPIRITS,
  157. SC_EXTREMITYFIST,
  158. -1,-1,-1,-1,
  159. SC_MAGICROD,
  160. -1,-1,-1,
  161. /* 280- */
  162. SC_FLAMELAUNCHER,
  163. SC_FROSTWEAPON,
  164. SC_LIGHTNINGLOADER,
  165. SC_SEISMICWEAPON,
  166. -1,
  167. SC_VOLCANO,
  168. SC_DELUGE,
  169. SC_VIOLENTGALE,
  170. SC_LANDPROTECTOR,
  171. -1,
  172. /* 290- */
  173. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  174. /* 300- */
  175. -1,-1,-1,-1,-1,-1,
  176. SC_LULLABY,
  177. SC_RICHMANKIM,
  178. SC_ETERNALCHAOS,
  179. SC_DRUMBATTLE,
  180. /* 310- */
  181. SC_NIBELUNGEN,
  182. SC_ROKISWEIL,
  183. SC_INTOABYSS,
  184. SC_SIEGFRIED,
  185. -1,-1,-1,
  186. SC_DISSONANCE,
  187. -1,
  188. SC_WHISTLE,
  189. /* 320- */
  190. SC_ASSNCROS,
  191. SC_POEMBRAGI,
  192. SC_APPLEIDUN,
  193. -1,-1,
  194. SC_UGLYDANCE,
  195. -1,
  196. SC_HUMMING,
  197. SC_DONTFORGETME,
  198. SC_FORTUNE,
  199. /* 330- */
  200. SC_SERVICE4U,
  201. SC_SELFDESTRUCTION,
  202. -1,-1,-1,-1,-1,-1,-1,-1,
  203. /* 340- */
  204. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  205. /* 350- */
  206. -1,-1,-1,-1,-1,
  207. SC_AURABLADE,
  208. SC_PARRYING,
  209. SC_CONCENTRATION,
  210. SC_TENSIONRELAX,
  211. SC_BERSERK,
  212. /* 360- */
  213. SC_BERSERK,
  214. SC_ASSUMPTIO,
  215. SC_BASILICA,
  216. -1,-1,-1,
  217. SC_MAGICPOWER,
  218. -1,
  219. SC_SACRIFICE,
  220. SC_GOSPEL,
  221. /* 370- */
  222. -1,-1,-1,-1,-1,-1,-1,-1,
  223. SC_EDP,
  224. -1,
  225. /* 380- */
  226. SC_TRUESIGHT,
  227. -1,-1,
  228. SC_WINDWALK,
  229. SC_MELTDOWN,
  230. -1,-1,
  231. SC_CARTBOOST,
  232. -1,
  233. SC_CHASEWALK,
  234. /* 390- */
  235. SC_REJECTSWORD,
  236. -1,-1,-1,-1,
  237. SC_MOONLIT,
  238. SC_MARIONETTE,
  239. -1,
  240. SC_BLEEDING,
  241. SC_JOINTBEAT,
  242. /* 400 */
  243. -1,-1,
  244. SC_MINDBREAKER,
  245. SC_MEMORIZE,
  246. SC_FOGWALL,
  247. SC_SPIDERWEB,
  248. -1,-1,-1,-1,
  249. /* 410- */
  250. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  251. };
  252. static int max_weight_base[MAX_PC_CLASS];
  253. static int hp_coefficient[MAX_PC_CLASS];
  254. static int hp_coefficient2[MAX_PC_CLASS];
  255. static int hp_sigma_val[MAX_PC_CLASS][MAX_LEVEL];
  256. static int sp_coefficient[MAX_PC_CLASS];
  257. static int aspd_base[MAX_PC_CLASS][20];
  258. static int refinebonus[5][3]; // 精錬ボーナステーブル(refine_db.txt)
  259. int percentrefinery[5][10]; // 精錬成功率(refine_db.txt)
  260. static int atkmods[3][20]; // 武器ATKサイズ修正(size_fix.txt)
  261. static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL];
  262. /*==========================================
  263. * 精錬ボーナス
  264. *------------------------------------------
  265. */
  266. int status_getrefinebonus(int lv,int type)
  267. {
  268. if (lv >= 0 && lv < 5 && type >= 0 && type < 3)
  269. return refinebonus[lv][type];
  270. return 0;
  271. }
  272. /*==========================================
  273. * 精錬成功率
  274. *------------------------------------------
  275. */
  276. int status_percentrefinery(struct map_session_data *sd,struct item *item)
  277. {
  278. int percent;
  279. nullpo_retr(0, item);
  280. percent=percentrefinery[itemdb_wlv(item->nameid)][(int)item->refine];
  281. percent += pc_checkskill(sd,BS_WEAPONRESEARCH); // 武器研究スキル所持
  282. // 確率の有効範囲チェック
  283. if( percent > 100 ){
  284. percent = 100;
  285. }
  286. if( percent < 0 ){
  287. percent = 0;
  288. }
  289. return percent;
  290. }
  291. /*==========================================
  292. * パラメータ計算
  293. * first==0の時、計算対象のパラメータが呼び出し前から
  294. * 変 化した場合自動でsendするが、
  295. * 能動的に変化させたパラメータは自前でsendするように
  296. *------------------------------------------
  297. */
  298. int status_calc_pc(struct map_session_data* sd,int first)
  299. {
  300. int b_speed,b_max_hp,b_max_sp,b_hp,b_sp,b_weight,b_max_weight,b_paramb[6],b_parame[6],b_hit,b_flee;
  301. int b_aspd,b_watk,b_def,b_watk2,b_def2,b_flee2,b_critical,b_attackrange,b_matk1,b_matk2,b_mdef,b_mdef2,b_class;
  302. int b_base_atk;
  303. struct skill b_skill[MAX_SKILL];
  304. int i,bl,index;
  305. int skill,aspd_rate,wele,wele_,def_ele,refinedef=0;
  306. int pele=0,pdef_ele=0;
  307. int str,dstr,dex;
  308. struct pc_base_job s_class;
  309. nullpo_retr(0, sd);
  310. //?生や養子の場合の元の職業を算出する
  311. s_class = pc_calc_base_job(sd->status.class_);
  312. b_speed = sd->speed;
  313. b_max_hp = sd->status.max_hp;
  314. b_max_sp = sd->status.max_sp;
  315. b_hp = sd->status.hp;
  316. b_sp = sd->status.sp;
  317. b_weight = sd->weight;
  318. b_max_weight = sd->max_weight;
  319. memcpy(b_paramb,&sd->paramb,sizeof(b_paramb));
  320. memcpy(b_parame,&sd->paramc,sizeof(b_parame));
  321. memcpy(b_skill,&sd->status.skill,sizeof(b_skill));
  322. b_hit = sd->hit;
  323. b_flee = sd->flee;
  324. b_aspd = sd->aspd;
  325. b_watk = sd->watk;
  326. b_def = sd->def;
  327. b_watk2 = sd->watk2;
  328. b_def2 = sd->def2;
  329. b_flee2 = sd->flee2;
  330. b_critical = sd->critical;
  331. b_attackrange = sd->attackrange;
  332. b_matk1 = sd->matk1;
  333. b_matk2 = sd->matk2;
  334. b_mdef = sd->mdef;
  335. b_mdef2 = sd->mdef2;
  336. b_class = sd->view_class;
  337. sd->view_class = sd->status.class_;
  338. b_base_atk = sd->base_atk;
  339. pc_calc_skilltree(sd); // スキルツリ?の計算
  340. sd->max_weight = max_weight_base[s_class.job]+sd->status.str*300;
  341. if(first&1) {
  342. sd->weight=0;
  343. for(i=0;i<MAX_INVENTORY;i++){
  344. if(sd->status.inventory[i].nameid==0 || sd->inventory_data[i] == NULL)
  345. continue;
  346. sd->weight += sd->inventory_data[i]->weight*sd->status.inventory[i].amount;
  347. }
  348. sd->cart_max_weight=battle_config.max_cart_weight;
  349. sd->cart_weight=0;
  350. sd->cart_max_num=MAX_CART;
  351. sd->cart_num=0;
  352. for(i=0;i<MAX_CART;i++){
  353. if(sd->status.cart[i].nameid==0)
  354. continue;
  355. sd->cart_weight+=itemdb_weight(sd->status.cart[i].nameid)*sd->status.cart[i].amount;
  356. sd->cart_num++;
  357. }
  358. }
  359. memset(sd->paramb,0,sizeof(sd->paramb));
  360. memset(sd->parame,0,sizeof(sd->parame));
  361. sd->hit = 0;
  362. sd->flee = 0;
  363. sd->flee2 = 0;
  364. sd->critical = 0;
  365. sd->aspd = 0;
  366. sd->watk = 0;
  367. sd->def = 0;
  368. sd->mdef = 0;
  369. sd->watk2 = 0;
  370. sd->def2 = 0;
  371. sd->mdef2 = 0;
  372. sd->status.max_hp = 0;
  373. sd->status.max_sp = 0;
  374. sd->attackrange = 0;
  375. sd->attackrange_ = 0;
  376. sd->atk_ele = 0;
  377. sd->def_ele = 0;
  378. sd->star =0;
  379. sd->overrefine =0;
  380. sd->matk1 =0;
  381. sd->matk2 =0;
  382. sd->speed = DEFAULT_WALK_SPEED ;
  383. sd->hprate=battle_config.hp_rate;
  384. sd->sprate=battle_config.sp_rate;
  385. sd->castrate=100;
  386. sd->delayrate=100;
  387. sd->dsprate=100;
  388. sd->base_atk=0;
  389. sd->arrow_atk=0;
  390. sd->arrow_ele=0;
  391. sd->arrow_hit=0;
  392. sd->arrow_range=0;
  393. sd->nhealhp=sd->nhealsp=sd->nshealhp=sd->nshealsp=sd->nsshealhp=sd->nsshealsp=0;
  394. memset(sd->addele,0,sizeof(sd->addele));
  395. memset(sd->addrace,0,sizeof(sd->addrace));
  396. memset(sd->addsize,0,sizeof(sd->addsize));
  397. memset(sd->addele_,0,sizeof(sd->addele_));
  398. memset(sd->addrace_,0,sizeof(sd->addrace_));
  399. memset(sd->addsize_,0,sizeof(sd->addsize_));
  400. memset(sd->subele,0,sizeof(sd->subele));
  401. memset(sd->subrace,0,sizeof(sd->subrace));
  402. memset(sd->addeff,0,sizeof(sd->addeff));
  403. memset(sd->addeff2,0,sizeof(sd->addeff2));
  404. memset(sd->reseff,0,sizeof(sd->reseff));
  405. memset(&sd->special_state,0,sizeof(sd->special_state));
  406. memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele));
  407. memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race));
  408. memset(sd->weapon_atk,0,sizeof(sd->weapon_atk));
  409. memset(sd->weapon_atk_rate,0,sizeof(sd->weapon_atk_rate));
  410. sd->watk_ = 0; //二刀流用(?)
  411. sd->watk_2 = 0;
  412. sd->atk_ele_ = 0;
  413. sd->star_ = 0;
  414. sd->overrefine_ = 0;
  415. sd->aspd_rate = 100;
  416. sd->speed_rate = 100;
  417. sd->hprecov_rate = 100;
  418. sd->sprecov_rate = 100;
  419. sd->critical_def = 0;
  420. sd->double_rate = 0;
  421. sd->near_attack_def_rate = sd->long_attack_def_rate = 0;
  422. sd->atk_rate = sd->matk_rate = 100;
  423. sd->ignore_def_ele = sd->ignore_def_race = 0;
  424. sd->ignore_def_ele_ = sd->ignore_def_race_ = 0;
  425. sd->ignore_mdef_ele = sd->ignore_mdef_race = 0;
  426. sd->arrow_cri = 0;
  427. sd->magic_def_rate = sd->misc_def_rate = 0;
  428. memset(sd->arrow_addele,0,sizeof(sd->arrow_addele));
  429. memset(sd->arrow_addrace,0,sizeof(sd->arrow_addrace));
  430. memset(sd->arrow_addsize,0,sizeof(sd->arrow_addsize));
  431. memset(sd->arrow_addeff,0,sizeof(sd->arrow_addeff));
  432. memset(sd->arrow_addeff2,0,sizeof(sd->arrow_addeff2));
  433. memset(sd->magic_addele,0,sizeof(sd->magic_addele));
  434. memset(sd->magic_addrace,0,sizeof(sd->magic_addrace));
  435. memset(sd->magic_subrace,0,sizeof(sd->magic_subrace));
  436. sd->perfect_hit = 0;
  437. sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100;
  438. sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100;
  439. sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0;
  440. sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0;
  441. sd->get_zeny_num = 0;
  442. sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0;
  443. sd->add_def_class_count = sd->add_mdef_class_count = 0;
  444. sd->monster_drop_item_count = 0;
  445. memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate));
  446. memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_));
  447. memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate));
  448. memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate));
  449. memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate));
  450. memset(sd->monster_drop_race,0,sizeof(sd->monster_drop_race));
  451. memset(sd->monster_drop_itemrate,0,sizeof(sd->monster_drop_itemrate));
  452. sd->speed_add_rate = sd->aspd_add_rate = 100;
  453. sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0;
  454. sd->splash_range = sd->splash_add_range = 0;
  455. sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0;
  456. sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate = sd->sp_drain_per = 0;
  457. sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ = sd->sp_drain_per_ = 0;
  458. sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0;
  459. sd->magic_damage_return = 0; //AppleGirl Was Here
  460. sd->random_attack_increase_add = sd->random_attack_increase_per = 0;
  461. sd->hp_drain_value = sd->hp_drain_value_ = sd->sp_drain_value = sd->sp_drain_value_ = 0;
  462. sd->unbreakable_equip = 0;
  463. sd->break_weapon_rate = sd->break_armor_rate = 0;
  464. sd->add_steal_rate = 0;
  465. sd->crit_atk_rate = 0;
  466. sd->no_regen = 0;
  467. sd->unstripable_equip = 0;
  468. sd->autospell2_id = sd->autospell2_lv = sd->autospell2_rate = 0;
  469. memset(sd->critaddrace,0,sizeof(sd->critaddrace));
  470. memset(sd->addeff3,0,sizeof(sd->addeff3));
  471. memset(sd->skillatk,0,sizeof(sd->skillatk));
  472. sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0;
  473. sd->add_def_class_count = sd->add_mdef_class_count = 0;
  474. sd->add_damage_class_count2 = 0;
  475. memset(sd->add_damage_classid,0,sizeof(sd->add_damage_classid));
  476. memset(sd->add_damage_classid_,0,sizeof(sd->add_damage_classid_));
  477. memset(sd->add_magic_damage_classid,0,sizeof(sd->add_magic_damage_classid));
  478. memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate));
  479. memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_));
  480. memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate));
  481. memset(sd->add_def_classid,0,sizeof(sd->add_def_classid));
  482. memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate));
  483. memset(sd->add_mdef_classid,0,sizeof(sd->add_mdef_classid));
  484. memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate));
  485. memset(sd->add_damage_classid2,0,sizeof(sd->add_damage_classid2));
  486. memset(sd->add_damage_classrate2,0,sizeof(sd->add_damage_classrate2));
  487. sd->sp_gain_value = 0;
  488. sd->ignore_def_mob = sd->ignore_def_mob_ = 0;
  489. sd->hp_loss_rate = sd->hp_loss_value = sd->hp_loss_type = 0;
  490. memset(sd->addrace2,0,sizeof(sd->addrace2));
  491. memset(sd->addrace2_,0,sizeof(sd->addrace2_));
  492. sd->hp_gain_value = sd->sp_drain_type = 0;
  493. memset(sd->subsize,0,sizeof(sd->subsize));
  494. sd->unequip_damage = 0;
  495. if(!sd->disguiseflag && sd->disguise) {
  496. sd->disguise=0;
  497. clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
  498. clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
  499. clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom);
  500. clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top);
  501. clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid);
  502. clif_clearchar(&sd->bl, 9);
  503. pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3);
  504. }
  505. for(i=0;i<10;i++) {
  506. index = sd->equip_index[i];
  507. if(index < 0)
  508. continue;
  509. if(i == 9 && sd->equip_index[8] == index)
  510. continue;
  511. if(i == 5 && sd->equip_index[4] == index)
  512. continue;
  513. if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
  514. continue;
  515. if(sd->inventory_data[index]) {
  516. if(sd->inventory_data[index]->type == 4) {
  517. if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
  518. int j;
  519. for(j=0;j<sd->inventory_data[index]->slot;j++){ // カ?ド
  520. int c=sd->status.inventory[index].card[j];
  521. if(c>0){
  522. if(i == 8 && sd->status.inventory[index].equip == 0x20)
  523. sd->state.lr_flag = 1;
  524. run_script(itemdb_equipscript(c),0,sd->bl.id,0);
  525. sd->state.lr_flag = 0;
  526. }
  527. }
  528. }
  529. }
  530. else if(sd->inventory_data[index]->type==5){ // 防具
  531. if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) {
  532. int j;
  533. for(j=0;j<sd->inventory_data[index]->slot;j++){ // カ?ド
  534. int c=sd->status.inventory[index].card[j];
  535. if(c>0)
  536. run_script(itemdb_equipscript(c),0,sd->bl.id,0);
  537. }
  538. }
  539. }
  540. }
  541. }
  542. wele = sd->atk_ele;
  543. wele_ = sd->atk_ele_;
  544. def_ele = sd->def_ele;
  545. if(sd->status.pet_id > 0) {
  546. struct pet_data *pd=sd->pd;
  547. if((pd && battle_config.pet_status_support==1) && (battle_config.pet_equip_required==0 || (battle_config.pet_equip_required && pd->equip > 0))) {
  548. if(sd->status.pet_id > 0 && sd->petDB && sd->pet.intimate > 0 &&
  549. pd->state.skillbonus == 1) {
  550. pc_bonus(sd,pd->skillbonustype,pd->skillbonusval);
  551. // run_script(sd->petDB->script,0,sd->bl.id,0);
  552. }
  553. pele = sd->atk_ele;
  554. pdef_ele = sd->def_ele;
  555. sd->atk_ele = sd->def_ele = 0;
  556. }
  557. }
  558. memcpy(sd->paramcard,sd->parame,sizeof(sd->paramcard));
  559. // ?備品によるステ?タス?化はここで?行
  560. for(i=0;i<10;i++) {
  561. index = sd->equip_index[i];
  562. if(index < 0)
  563. continue;
  564. if(i == 9 && sd->equip_index[8] == index)
  565. continue;
  566. if(i == 5 && sd->equip_index[4] == index)
  567. continue;
  568. if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index))
  569. continue;
  570. if(sd->inventory_data[index]) {
  571. sd->def += sd->inventory_data[index]->def;
  572. if(sd->inventory_data[index]->type == 4) {
  573. int r,wlv = sd->inventory_data[index]->wlv;
  574. if(i == 8 && sd->status.inventory[index].equip == 0x20) {
  575. //二刀流用デ?タ入力
  576. sd->watk_ += sd->inventory_data[index]->atk;
  577. sd->watk_2 = (r=sd->status.inventory[index].refine)* // 精?攻?力
  578. refinebonus[wlv][0];
  579. if( (r-=refinebonus[wlv][2])>0 ) // 過?精?ボ?ナス
  580. sd->overrefine_ = r*refinebonus[wlv][1];
  581. if(sd->status.inventory[index].card[0]==0x00ff){ // 製造武器
  582. sd->star_ = (sd->status.inventory[index].card[1]>>8); // 星のかけら
  583. wele_= (sd->status.inventory[index].card[1]&0x0f); // ? 性
  584. }
  585. sd->attackrange_ += sd->inventory_data[index]->range;
  586. sd->state.lr_flag = 1;
  587. run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
  588. sd->state.lr_flag = 0;
  589. }
  590. else { //二刀流武器以外
  591. sd->watk += sd->inventory_data[index]->atk;
  592. sd->watk2 += (r=sd->status.inventory[index].refine)* // 精?攻?力
  593. refinebonus[wlv][0];
  594. if( (r-=refinebonus[wlv][2])>0 ) // 過?精?ボ?ナス
  595. sd->overrefine += r*refinebonus[wlv][1];
  596. if(sd->status.inventory[index].card[0]==0x00ff){ // 製造武器
  597. sd->star += (sd->status.inventory[index].card[1]>>8); // 星のかけら
  598. wele = (sd->status.inventory[index].card[1]&0x0f); // ? 性
  599. }
  600. sd->attackrange += sd->inventory_data[index]->range;
  601. run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
  602. }
  603. }
  604. else if(sd->inventory_data[index]->type == 5) {
  605. sd->watk += sd->inventory_data[index]->atk;
  606. refinedef += sd->status.inventory[index].refine*refinebonus[0][0];
  607. run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
  608. }
  609. }
  610. }
  611. if(sd->equip_index[10] >= 0){ // 矢
  612. index = sd->equip_index[10];
  613. if(sd->inventory_data[index]){ //まだ?性が入っていない
  614. sd->state.lr_flag = 2;
  615. run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0);
  616. sd->state.lr_flag = 0;
  617. sd->arrow_atk += sd->inventory_data[index]->atk;
  618. }
  619. }
  620. sd->def += (refinedef+50)/100;
  621. if(sd->attackrange < 1) sd->attackrange = 1;
  622. if(sd->attackrange_ < 1) sd->attackrange_ = 1;
  623. if(sd->attackrange < sd->attackrange_)
  624. sd->attackrange = sd->attackrange_;
  625. if(sd->status.weapon == 11)
  626. sd->attackrange += sd->arrow_range;
  627. if(wele > 0)
  628. sd->atk_ele = wele;
  629. if(wele_ > 0)
  630. sd->atk_ele_ = wele_;
  631. if(def_ele > 0)
  632. sd->def_ele = def_ele;
  633. if(battle_config.pet_status_support) {
  634. if(pele > 0 && !sd->atk_ele)
  635. sd->atk_ele = pele;
  636. if(pdef_ele > 0 && !sd->def_ele)
  637. sd->def_ele = pdef_ele;
  638. }
  639. sd->double_rate += sd->double_add_rate;
  640. sd->perfect_hit += sd->perfect_hit_add;
  641. sd->get_zeny_num += sd->get_zeny_add_num;
  642. sd->splash_range += sd->splash_add_range;
  643. if(sd->speed_add_rate != 100)
  644. sd->speed_rate += sd->speed_add_rate - 100;
  645. if(sd->aspd_add_rate != 100)
  646. sd->aspd_rate += sd->aspd_add_rate - 100;
  647. // 武器ATKサイズ補正 (右手)
  648. sd->atkmods[0] = atkmods[0][sd->weapontype1];
  649. sd->atkmods[1] = atkmods[1][sd->weapontype1];
  650. sd->atkmods[2] = atkmods[2][sd->weapontype1];
  651. //武器ATKサイズ補正 (左手)
  652. sd->atkmods_[0] = atkmods[0][sd->weapontype2];
  653. sd->atkmods_[1] = atkmods[1][sd->weapontype2];
  654. sd->atkmods_[2] = atkmods[2][sd->weapontype2];
  655. // jobボ?ナス分
  656. for(i=0;i<sd->status.job_level && i<MAX_LEVEL;i++){
  657. if(job_bonus[s_class.upper][s_class.job][i])
  658. sd->paramb[job_bonus[s_class.upper][s_class.job][i]-1]++;
  659. }
  660. if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // skill can be used with an item now, thanks to orn [Valaris]
  661. sd->max_weight += skill*2000;
  662. if( (skill=pc_checkskill(sd,AC_OWL))>0 ) // ふくろうの目
  663. sd->paramb[4] += skill;
  664. if((skill=pc_checkskill(sd,BS_HILTBINDING))>0) { // Hilt binding gives +1 str +4 atk
  665. sd->paramb[0] ++;
  666. sd->base_atk += 4;
  667. }
  668. if((skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // Dragonology increases +1 int every 2 levels
  669. sd->paramb[3] += (skill+1)*0.5;
  670. }
  671. // New guild skills - Celest
  672. if (sd->status.guild_id > 0 && !(first&4)) {
  673. struct guild *g;
  674. if ((g = guild_search(sd->status.guild_id)) && strcmp(sd->status.name,g->master)==0) {
  675. if (!sd->state.leadership_flag && guild_checkskill(g, GD_LEADERSHIP)>0) {
  676. skill_unitsetting(&sd->bl,GD_LEADERSHIP,1,sd->bl.x,sd->bl.y,0);
  677. }
  678. if (!sd->state.glorywounds_flag && guild_checkskill(g, GD_GLORYWOUNDS)>0) {
  679. skill_unitsetting(&sd->bl,GD_GLORYWOUNDS,1,sd->bl.x,sd->bl.y,0);
  680. }
  681. if (!sd->state.soulcold_flag && guild_checkskill(g, GD_SOULCOLD)>0) {
  682. skill_unitsetting(&sd->bl,GD_SOULCOLD,1,sd->bl.x,sd->bl.y,0);
  683. }
  684. if (!sd->state.hawkeyes_flag && guild_checkskill(g, GD_HAWKEYES)>0) {
  685. skill_unitsetting(&sd->bl,GD_HAWKEYES,1,sd->bl.x,sd->bl.y,0);
  686. }
  687. }
  688. else if (g) {
  689. if (sd->sc_count && sd->sc_data[SC_BATTLEORDERS].timer != -1) {
  690. sd->paramb[0]+= 5;
  691. sd->paramb[3]+= 5;
  692. sd->paramb[4]+= 5;
  693. }
  694. if (sd->state.leadership_flag)
  695. sd->paramb[0] += 2;
  696. if (sd->state.glorywounds_flag)
  697. sd->paramb[2] += 2;
  698. if (sd->state.soulcold_flag)
  699. sd->paramb[1] += 2;
  700. if (sd->state.hawkeyes_flag)
  701. sd->paramb[4] += 2;
  702. }
  703. }
  704. // ステ?タス?化による基本パラメ?タ補正
  705. if(sd->sc_count){
  706. if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // 集中力向上
  707. sd->paramb[1]+= (sd->status.agi+sd->paramb[1]+sd->parame[1]-sd->paramcard[1])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
  708. sd->paramb[4]+= (sd->status.dex+sd->paramb[4]+sd->parame[4]-sd->paramcard[4])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100;
  709. }
  710. if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // 速度?加
  711. sd->paramb[1]+= 2+sd->sc_data[SC_INCREASEAGI].val1;
  712. sd->speed -= sd->speed *25/100;
  713. }
  714. if(sd->sc_data[SC_DECREASEAGI].timer!=-1) { // 速度減少(agiはbattle.cで)
  715. sd->speed = sd->speed *125/100;
  716. sd->paramb[1] -= 2 + sd->sc_data[SC_DECREASEAGI].val1; // reduce agility [celest]
  717. }
  718. if(sd->sc_data[SC_CLOAKING].timer!=-1) {
  719. sd->critical_rate += 100; // critical increases
  720. sd->speed = sd->speed * (sd->sc_data[SC_CLOAKING].val3-sd->sc_data[SC_CLOAKING].val1*3) /100;
  721. }
  722. if(sd->sc_data[SC_CHASEWALK].timer!=-1) {
  723. sd->speed = sd->speed * sd->sc_data[SC_CHASEWALK].val3 /100; // slow down by chasewalk
  724. if(sd->sc_data[SC_CHASEWALK].val4)
  725. sd->paramb[0] += (1<<(sd->sc_data[SC_CHASEWALK].val1-1)); // increases strength after 10 seconds
  726. }
  727. if(sd->sc_data[SC_SLOWDOWN].timer!=-1)
  728. sd->speed = sd->speed*150/100;
  729. if(sd->sc_data[SC_SPEEDUP0].timer!=-1)
  730. sd->speed -= sd->speed*25/100;
  731. if(sd->sc_data[SC_BLESSING].timer!=-1){ // ブレッシング
  732. sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1;
  733. sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1;
  734. sd->paramb[4]+= sd->sc_data[SC_BLESSING].val1;
  735. }
  736. if(sd->sc_data[SC_GLORIA].timer!=-1) // グロリア
  737. sd->paramb[5]+= 30;
  738. if(sd->sc_data[SC_LOUD].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // ラウドボイス
  739. sd->paramb[0]+= 4;
  740. if(sd->sc_data[SC_QUAGMIRE].timer!=-1){ // クァグマイア
  741. //int agib = (sd->status.agi+sd->paramb[1]+sd->parame[1])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
  742. //int dexb = (sd->status.dex+sd->paramb[4]+sd->parame[4])*(sd->sc_data[SC_QUAGMIRE].val1*10)/100;
  743. //sd->paramb[1]-= agib > 50 ? 50 : agib;
  744. //sd->paramb[4]-= dexb > 50 ? 50 : dexb;
  745. sd->paramb[1]-= sd->sc_data[SC_QUAGMIRE].val1*5;
  746. sd->paramb[4]-= sd->sc_data[SC_QUAGMIRE].val1*5;
  747. sd->speed = sd->speed*3/2;
  748. }
  749. if(sd->sc_data[SC_TRUESIGHT].timer!=-1){ // トゥル?サイト
  750. sd->paramb[0]+= 5;
  751. sd->paramb[1]+= 5;
  752. sd->paramb[2]+= 5;
  753. sd->paramb[3]+= 5;
  754. sd->paramb[4]+= 5;
  755. sd->paramb[5]+= 5;
  756. }
  757. if(sd->sc_data[SC_MARIONETTE].timer!=-1){
  758. struct map_session_data *psd = map_id2sd(sd->sc_data[SC_MARIONETTE2].val3);
  759. if (psd) { // if partner is found
  760. sd->paramb[0]-= sd->status.str/2; // bonuses not included
  761. sd->paramb[1]-= sd->status.agi/2;
  762. sd->paramb[2]-= sd->status.vit/2;
  763. sd->paramb[3]-= sd->status.int_/2;
  764. sd->paramb[4]-= sd->status.dex/2;
  765. sd->paramb[5]-= sd->status.luk/2;
  766. }
  767. }
  768. else if(sd->sc_data[SC_MARIONETTE2].timer!=-1){
  769. struct map_session_data *psd = map_id2sd(sd->sc_data[SC_MARIONETTE2].val3);
  770. if (psd) { // if partner is found
  771. sd->paramb[0] += sd->status.str+psd->status.str/2 > 99 ? 99-sd->status.str : psd->status.str/2;
  772. sd->paramb[1] += sd->status.agi+psd->status.agi/2 > 99 ? 99-sd->status.agi : psd->status.agi/2;
  773. sd->paramb[2] += sd->status.vit+psd->status.vit/2 > 99 ? 99-sd->status.vit : psd->status.vit/2;
  774. sd->paramb[3] += sd->status.int_+psd->status.int_/2 > 99 ? 99-sd->status.int_ : psd->status.int_/2;
  775. sd->paramb[4] += sd->status.dex+psd->status.dex/2 > 99 ? 99-sd->status.dex : psd->status.dex/2;
  776. sd->paramb[5] += sd->status.luk+psd->status.luk/2 > 99 ? 99-sd->status.luk : psd->status.luk/2;
  777. }
  778. }
  779. if(sd->sc_data[SC_GOSPEL].timer!=-1 && sd->sc_data[SC_GOSPEL].val4 == BCT_PARTY){
  780. if (sd->sc_data[SC_GOSPEL].val3 == 6) {
  781. sd->paramb[0]+= 2;
  782. sd->paramb[1]+= 2;
  783. sd->paramb[2]+= 2;
  784. sd->paramb[3]+= 2;
  785. sd->paramb[4]+= 2;
  786. sd->paramb[5]+= 2;
  787. }
  788. }
  789. }
  790. //1度も死んでないJob70スパノビに+10
  791. if(s_class.job == 23 && sd->die_counter == 0 && sd->status.job_level >= 70){
  792. sd->paramb[0]+= 15;
  793. sd->paramb[1]+= 15;
  794. sd->paramb[2]+= 15;
  795. sd->paramb[3]+= 15;
  796. sd->paramb[4]+= 15;
  797. sd->paramb[5]+= 15;
  798. }
  799. sd->paramc[0]=sd->status.str+sd->paramb[0]+sd->parame[0];
  800. sd->paramc[1]=sd->status.agi+sd->paramb[1]+sd->parame[1];
  801. sd->paramc[2]=sd->status.vit+sd->paramb[2]+sd->parame[2];
  802. sd->paramc[3]=sd->status.int_+sd->paramb[3]+sd->parame[3];
  803. sd->paramc[4]=sd->status.dex+sd->paramb[4]+sd->parame[4];
  804. sd->paramc[5]=sd->status.luk+sd->paramb[5]+sd->parame[5];
  805. for(i=0;i<6;i++)
  806. if(sd->paramc[i] < 0) sd->paramc[i] = 0;
  807. if (sd->sc_count) {
  808. if (sd->sc_data[SC_CURSE].timer!=-1)
  809. sd->paramc[5] = 0;
  810. }
  811. if(sd->status.weapon == 11 || sd->status.weapon == 13 || sd->status.weapon == 14) {
  812. str = sd->paramc[4];
  813. dex = sd->paramc[0];
  814. }
  815. else {
  816. str = sd->paramc[0];
  817. dex = sd->paramc[4];
  818. }
  819. dstr = str/10;
  820. sd->base_atk += str + dstr*dstr + dex/5 + sd->paramc[5]/5;
  821. sd->matk1 += sd->paramc[3]+(sd->paramc[3]/5)*(sd->paramc[3]/5);
  822. sd->matk2 += sd->paramc[3]+(sd->paramc[3]/7)*(sd->paramc[3]/7);
  823. if(sd->matk1 < sd->matk2) {
  824. int temp = sd->matk2;
  825. sd->matk2 = sd->matk1;
  826. sd->matk1 = temp;
  827. }
  828. sd->hit += sd->paramc[4] + sd->status.base_level;
  829. sd->flee += sd->paramc[1] + sd->status.base_level;
  830. sd->def2 += sd->paramc[2];
  831. sd->mdef2 += sd->paramc[3];
  832. sd->flee2 += sd->paramc[5]+10;
  833. sd->critical += (sd->paramc[5]*3)+10;
  834. if(sd->base_atk < 1)
  835. sd->base_atk = 1;
  836. if(sd->critical_rate != 100)
  837. sd->critical = (sd->critical*sd->critical_rate)/100;
  838. if(sd->critical < 10) sd->critical = 10;
  839. if(sd->hit_rate != 100)
  840. sd->hit = (sd->hit*sd->hit_rate)/100;
  841. if(sd->hit < 1) sd->hit = 1;
  842. if(sd->flee_rate != 100)
  843. sd->flee = (sd->flee*sd->flee_rate)/100;
  844. if(sd->flee < 1) sd->flee = 1;
  845. if(sd->flee2_rate != 100)
  846. sd->flee2 = (sd->flee2*sd->flee2_rate)/100;
  847. if(sd->flee2 < 10) sd->flee2 = 10;
  848. if(sd->def_rate != 100)
  849. sd->def = (sd->def*sd->def_rate)/100;
  850. if(sd->def < 0) sd->def = 0;
  851. if(sd->def2_rate != 100)
  852. sd->def2 = (sd->def2*sd->def2_rate)/100;
  853. if(sd->def2 < 1) sd->def2 = 1;
  854. if(sd->mdef_rate != 100)
  855. sd->mdef = (sd->mdef*sd->mdef_rate)/100;
  856. if(sd->mdef < 0) sd->mdef = 0;
  857. if(sd->mdef2_rate != 100)
  858. sd->mdef2 = (sd->mdef2*sd->mdef2_rate)/100;
  859. if(sd->mdef2 < 1) sd->mdef2 = 1;
  860. // 二刀流 ASPD 修正
  861. if (sd->status.weapon <= 16)
  862. sd->aspd += aspd_base[s_class.job][sd->status.weapon]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->status.weapon]/1000;
  863. else
  864. sd->aspd += (
  865. (aspd_base[s_class.job][sd->weapontype1]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype1]/1000) +
  866. (aspd_base[s_class.job][sd->weapontype2]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype2]/1000)
  867. ) * 140 / 200;
  868. aspd_rate = sd->aspd_rate;
  869. //攻?速度?加
  870. if((skill=pc_checkskill(sd,AC_VULTURE))>0){ // ワシの目
  871. sd->hit += skill;
  872. if(sd->status.weapon == 11)
  873. sd->attackrange += skill;
  874. }
  875. if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // 武器?究の命中率?加
  876. sd->hit += skill*2;
  877. if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // トンネルドライブ // トンネルドライブ
  878. sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9);
  879. if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0) // カ?トによる速度低下
  880. sd->speed += (10-skill) * (DEFAULT_WALK_SPEED * 0.1);
  881. else if (pc_isriding(sd)) { // ペコペコ?りによる速度?加
  882. sd->speed -= (0.25 * DEFAULT_WALK_SPEED);
  883. sd->max_weight += 10000;
  884. }
  885. if((skill=pc_checkskill(sd,CR_TRUST))>0) { // フェイス
  886. sd->status.max_hp += skill*200;
  887. sd->subele[6] += skill*5;
  888. }
  889. if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0) {
  890. sd->subele[0] += skill;
  891. sd->subele[3] += skill*5;
  892. }
  893. if((skill=pc_checkskill(sd,SA_ADVANCEDBOOK))>0 )
  894. aspd_rate -= skill*0.5;
  895. bl=sd->status.base_level;
  896. sd->status.max_hp += (3500 + bl*hp_coefficient2[s_class.job] + hp_sigma_val[s_class.job][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]);
  897. if (s_class.upper==1) // [MouseJstr]
  898. sd->status.max_hp = sd->status.max_hp * 130/100;
  899. else if (s_class.upper==2)
  900. sd->status.max_hp = sd->status.max_hp * 70/100;
  901. if(sd->hprate!=100)
  902. sd->status.max_hp = sd->status.max_hp*sd->hprate/100;
  903. if(sd->sc_count && sd->sc_data[SC_BERSERK].timer!=-1){ // バ?サ?ク
  904. sd->status.max_hp = sd->status.max_hp * 3;
  905. // sd->status.hp = sd->status.hp * 3;
  906. if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
  907. sd->status.max_hp = battle_config.max_hp;
  908. if(sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris
  909. sd->status.hp = battle_config.max_hp;
  910. }
  911. if(s_class.job == 23 && sd->status.base_level >= 99){
  912. sd->status.max_hp = sd->status.max_hp + 2000;
  913. }
  914. if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris
  915. sd->status.max_hp = battle_config.max_hp;
  916. if(sd->status.max_hp <= 0) sd->status.max_hp = 1; // end
  917. // 最大SP計算
  918. sd->status.max_sp += ((sp_coefficient[s_class.job] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]);
  919. if (s_class.upper==1) // [MouseJstr]
  920. sd->status.max_sp = sd->status.max_sp * 130/100;
  921. else if (s_class.upper==2)
  922. sd->status.max_sp = sd->status.max_sp * 70/100;
  923. if(sd->sprate!=100)
  924. sd->status.max_sp = sd->status.max_sp*sd->sprate/100;
  925. if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // メディテイティオ
  926. sd->status.max_sp += sd->status.max_sp*skill/100;
  927. if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0) /* ソウルドレイン */
  928. sd->status.max_sp += sd->status.max_sp*2*skill/100;
  929. if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
  930. sd->status.max_sp = battle_config.max_sp;
  931. //自然回復HP
  932. sd->nhealhp = 1 + (sd->paramc[2]/5) + (sd->status.max_hp/200);
  933. if((skill=pc_checkskill(sd,SM_RECOVERY)) > 0) { /* HP回復力向上 */
  934. sd->nshealhp = skill*5 + (sd->status.max_hp*skill/500);
  935. if(sd->nshealhp > 0x7fff) sd->nshealhp = 0x7fff;
  936. }
  937. //自然回復SP
  938. sd->nhealsp = 1 + (sd->paramc[3]/6) + (sd->status.max_sp/100);
  939. if(sd->paramc[3] >= 120)
  940. sd->nhealsp += ((sd->paramc[3]-120)>>1) + 4;
  941. if((skill=pc_checkskill(sd,MG_SRECOVERY)) > 0) { /* SP回復力向上 */
  942. sd->nshealsp = skill*3 + (sd->status.max_sp*skill/500);
  943. if(sd->nshealsp > 0x7fff) sd->nshealsp = 0x7fff;
  944. }
  945. if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0) {
  946. sd->nsshealhp = skill*4 + (sd->status.max_hp*skill/500);
  947. sd->nsshealsp = skill*2 + (sd->status.max_sp*skill/500);
  948. if(sd->nsshealhp > 0x7fff) sd->nsshealhp = 0x7fff;
  949. if(sd->nsshealsp > 0x7fff) sd->nsshealsp = 0x7fff;
  950. }
  951. if(sd->hprecov_rate != 100) {
  952. sd->nhealhp = sd->nhealhp*sd->hprecov_rate/100;
  953. if(sd->nhealhp < 1) sd->nhealhp = 1;
  954. }
  955. if(sd->sprecov_rate != 100) {
  956. sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100;
  957. if(sd->nhealsp < 1) sd->nhealsp = 1;
  958. }
  959. /* if((skill=pc_checkskill(sd,HP_MEDITATIO)) > 0) { // f?fffBfefCfefBfI,I'SPR,A*,I',E`,。ゥZ((c)。ョR「カn~.ゥォ,E',(c),(c),e'
  960. sd->nhealsp += 3*skill*(sd->status.max_sp)/100;
  961. if(sd->nhealsp > 0x7fff) sd->nhealsp = 0x7fff;
  962. } Increase natural SP regen instead of colossal SP Recovery effect [DracoRPG]*/
  963. // 種族耐性(これでいいの? ディバインプロテクションと同じ?理がいるかも)
  964. if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // ドラゴノロジ?
  965. skill = skill*4;
  966. sd->addrace[9]+=skill;
  967. sd->addrace_[9]+=skill;
  968. sd->subrace[9]+=skill;
  969. sd->magic_addrace[9]+=skill;
  970. sd->magic_subrace[9]-=skill;
  971. }
  972. //Flee上昇
  973. if( (skill=pc_checkskill(sd,TF_MISS))>0 ){ // 回避率?加
  974. if(sd->status.class_==6||sd->status.class_==4007 || sd->status.class_==23){
  975. sd->flee += skill*3;
  976. }
  977. if(sd->status.class_==12||sd->status.class_==17||sd->status.class_==4013||sd->status.class_==4018)
  978. sd->flee += skill*4;
  979. if(sd->status.class_==12||sd->status.class_==4013)
  980. sd->speed -= sd->speed *(skill*1.5)/100;
  981. }
  982. if( (skill=pc_checkskill(sd,MO_DODGE))>0 ) // 見切り
  983. sd->flee += (skill*3)>>1;
  984. // スキルやステ?タス異常による?りのパラメ?タ補正
  985. if(sd->sc_count){
  986. // ATK/DEF?化形
  987. if(sd->sc_data[SC_ANGELUS].timer!=-1) // エンジェラス
  988. sd->def2 = sd->def2*(110+5*sd->sc_data[SC_ANGELUS].val1)/100;
  989. if(sd->sc_data[SC_IMPOSITIO].timer!=-1) {// インポシティオマヌス
  990. sd->watk += sd->sc_data[SC_IMPOSITIO].val1*5;
  991. index = sd->equip_index[8];
  992. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
  993. sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1*5;
  994. }
  995. if(sd->sc_data[SC_PROVOKE].timer!=-1){ // プロボック
  996. sd->def2 = sd->def2*(100-6*sd->sc_data[SC_PROVOKE].val1)/100;
  997. sd->base_atk = sd->base_atk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
  998. sd->watk = sd->watk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
  999. index = sd->equip_index[8];
  1000. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
  1001. sd->watk_ = sd->watk_*(100+2*sd->sc_data[SC_PROVOKE].val1)/100;
  1002. }
  1003. if(sd->sc_data[SC_ENDURE].timer!=-1)
  1004. sd->mdef2 += sd->sc_data[SC_ENDURE].val1;
  1005. if(sd->sc_data[SC_MINDBREAKER].timer!=-1){ // プロボック
  1006. sd->mdef2 = sd->mdef2*(100-6*sd->sc_data[SC_MINDBREAKER].val1)/100;
  1007. sd->matk1 = sd->matk1*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
  1008. sd->matk2 = sd->matk2*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100;
  1009. }
  1010. if(sd->sc_data[SC_POISON].timer!=-1) // 毒?態
  1011. sd->def2 = sd->def2*75/100;
  1012. if(sd->sc_data[SC_CURSE].timer!=-1){
  1013. sd->base_atk = sd->base_atk*75/100;
  1014. sd->watk = sd->watk*75/100;
  1015. index = sd->equip_index[8];
  1016. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
  1017. sd->watk_ = sd->watk_*75/100;
  1018. }
  1019. if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // ?太鼓の響き
  1020. sd->watk += sd->sc_data[SC_DRUMBATTLE].val2;
  1021. sd->def += sd->sc_data[SC_DRUMBATTLE].val3;
  1022. index = sd->equip_index[8];
  1023. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
  1024. sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2;
  1025. }
  1026. if(sd->sc_data[SC_NIBELUNGEN].timer!=-1) { // ニ?ベルングの指輪
  1027. index = sd->equip_index[9];
  1028. /*if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
  1029. sd->watk += sd->sc_data[SC_NIBELUNGEN].val3;
  1030. index = sd->equip_index[8];
  1031. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3)
  1032. sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3;
  1033. index = sd->equip_index[9];*/
  1034. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
  1035. sd->watk2 += sd->sc_data[SC_NIBELUNGEN].val3;
  1036. index = sd->equip_index[8];
  1037. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4)
  1038. sd->watk_2 += sd->sc_data[SC_NIBELUNGEN].val3;
  1039. }
  1040. if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // ボルケ?ノ
  1041. sd->watk += sd->sc_data[SC_VIOLENTGALE].val3;
  1042. }
  1043. if(sd->sc_data[SC_SIGNUMCRUCIS].timer!=-1)
  1044. sd->def = sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2)/100;
  1045. if(sd->sc_data[SC_ETERNALCHAOS].timer!=-1) // エタ?ナルカオス
  1046. sd->def=0;
  1047. if(sd->sc_data[SC_CONCENTRATION].timer!=-1){ //コンセントレ?ション
  1048. sd->watk = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
  1049. index = sd->equip_index[8];
  1050. if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4)
  1051. sd->watk_ = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
  1052. sd->def = sd->def * (100 - 5*sd->sc_data[SC_CONCENTRATION].val1)/100;
  1053. }
  1054. if(sd->sc_data[SC_MAGICPOWER].timer!=-1){ //魔法力?幅
  1055. sd->matk1 = sd->matk1*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
  1056. sd->matk2 = sd->matk2*(100+5*sd->sc_data[SC_MAGICPOWER].val1)/100;
  1057. }
  1058. if(sd->sc_data[SC_ATKPOT].timer!=-1)
  1059. sd->watk += sd->sc_data[SC_ATKPOT].val1;
  1060. if(sd->sc_data[SC_MATKPOT].timer!=-1){
  1061. sd->matk1 += sd->sc_data[SC_MATKPOT].val1;
  1062. sd->matk2 += sd->sc_data[SC_MATKPOT].val1;
  1063. }
  1064. // ASPD/移動速度?化系
  1065. if(sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
  1066. aspd_rate -= 30;
  1067. if(sd->sc_data[SC_ADRENALINE].timer != -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
  1068. sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ
  1069. if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty)
  1070. aspd_rate -= 30;
  1071. else
  1072. aspd_rate -= 25;
  1073. }
  1074. if(sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 &&
  1075. sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン
  1076. aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2;
  1077. if(sd->sc_data[SC_ASSNCROS].timer!=-1 && // 夕陽のアサシンクロス
  1078. sd->sc_data[SC_TWOHANDQUICKEN].timer==-1 && sd->sc_data[SC_ADRENALINE].timer==-1 && sd->sc_data[SC_SPEARSQUICKEN].timer==-1 &&
  1079. sd->sc_data[SC_DONTFORGETME].timer == -1)
  1080. aspd_rate -= 5+sd->sc_data[SC_ASSNCROS].val1+sd->sc_data[SC_ASSNCROS].val2+sd->sc_data[SC_ASSNCROS].val3;
  1081. if(sd->sc_data[SC_DONTFORGETME].timer!=-1){ // 私を忘れないで
  1082. aspd_rate += sd->sc_data[SC_DONTFORGETME].val1*3 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3>>16);
  1083. sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100;
  1084. }
  1085. if( sd->sc_data[i=SC_SPEEDPOTION3].timer!=-1 ||
  1086. sd->sc_data[i=SC_SPEEDPOTION2].timer!=-1 ||
  1087. sd->sc_data[i=SC_SPEEDPOTION1].timer!=-1 ||
  1088. sd->sc_data[i=SC_SPEEDPOTION0].timer!=-1) // ? 速ポ?ション
  1089. aspd_rate -= sd->sc_data[i].val2;
  1090. if(sd->sc_data[SC_WINDWALK].timer!=-1 && sd->sc_data[SC_INCREASEAGI].timer==-1) //ウィンドウォ?ク暫ヘLv*2%減算
  1091. sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100;
  1092. if(sd->sc_data[SC_CARTBOOST].timer!=-1) // カ?トブ?スト
  1093. sd->speed -= (DEFAULT_WALK_SPEED * 20)/100;
  1094. if(sd->sc_data[SC_BERSERK].timer!=-1) //バ?サ?ク中はIAと同じぐらい速い?
  1095. sd->speed -= sd->speed *25/100;
  1096. if(sd->sc_data[SC_WEDDING].timer!=-1) //結婚中は?くのが?い
  1097. sd->speed = 2*DEFAULT_WALK_SPEED;
  1098. // HIT/FLEE?化系
  1099. if(sd->sc_data[SC_WHISTLE].timer!=-1){ // 口笛
  1100. sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1
  1101. +sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3>>16))/100;
  1102. sd->flee2+= (sd->sc_data[SC_WHISTLE].val1+sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3&0xffff)) * 10;
  1103. }
  1104. if(sd->sc_data[SC_HUMMING].timer!=-1) // ハミング
  1105. sd->hit += (sd->sc_data[SC_HUMMING].val1*2+sd->sc_data[SC_HUMMING].val2
  1106. +sd->sc_data[SC_HUMMING].val3) * sd->hit/100;
  1107. if(sd->sc_data[SC_VIOLENTGALE].timer!=-1 && sd->def_ele==4){ // バイオレントゲイル
  1108. sd->flee += sd->flee*sd->sc_data[SC_VIOLENTGALE].val3/100;
  1109. }
  1110. if(sd->sc_data[SC_BLIND].timer!=-1){ // 暗?
  1111. sd->hit -= sd->hit*25/100;
  1112. sd->flee -= sd->flee*25/100;
  1113. }
  1114. if(sd->sc_data[SC_WINDWALK].timer!=-1) // ウィンドウォ?ク
  1115. sd->flee += sd->flee*(sd->sc_data[SC_WINDWALK].val2)/100;
  1116. if(sd->sc_data[SC_SPIDERWEB].timer!=-1) //スパイダ?ウェブ
  1117. sd->flee -= sd->flee*50/100;
  1118. if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //トゥル?サイト
  1119. sd->hit += 3*(sd->sc_data[SC_TRUESIGHT].val1);
  1120. if(sd->sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレ?ション
  1121. sd->hit += (10*(sd->sc_data[SC_CONCENTRATION].val1));
  1122. // 耐性
  1123. if(sd->sc_data[SC_SIEGFRIED].timer!=-1){ // 不死身のジ?クフリ?ド
  1124. sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1125. sd->subele[2] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1126. sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // 火
  1127. sd->subele[4] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1128. sd->subele[5] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1129. sd->subele[6] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1130. sd->subele[7] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1131. sd->subele[8] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1132. sd->subele[9] += sd->sc_data[SC_SIEGFRIED].val2; // 水
  1133. }
  1134. if(sd->sc_data[SC_PROVIDENCE].timer!=-1){ // プロヴィデンス
  1135. sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // ? 聖?性
  1136. sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // ? ?魔
  1137. }
  1138. // その他
  1139. if(sd->sc_data[SC_APPLEIDUN].timer!=-1){ // イドゥンの林檎
  1140. sd->status.max_hp += ((5+sd->sc_data[SC_APPLEIDUN].val1*2+((sd->sc_data[SC_APPLEIDUN].val2+1)>>1)
  1141. +sd->sc_data[SC_APPLEIDUN].val3/10) * sd->status.max_hp)/100;
  1142. if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
  1143. sd->status.max_hp = battle_config.max_hp;
  1144. }
  1145. if(sd->sc_data[SC_DELUGE].timer!=-1 && sd->def_ele==1){ // デリュ?ジ
  1146. sd->status.max_hp += sd->status.max_hp*sd->sc_data[SC_DELUGE].val3/100;
  1147. if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp)
  1148. sd->status.max_hp = battle_config.max_hp;
  1149. }
  1150. if(sd->sc_data[SC_SERVICE4U].timer!=-1) { // サ?ビスフォ?ユ?
  1151. sd->status.max_sp += sd->status.max_sp*(10+sd->sc_data[SC_SERVICE4U].val1+sd->sc_data[SC_SERVICE4U].val2
  1152. +sd->sc_data[SC_SERVICE4U].val3)/100;
  1153. if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp)
  1154. sd->status.max_sp = battle_config.max_sp;
  1155. sd->dsprate-=(10+sd->sc_data[SC_SERVICE4U].val1*3+sd->sc_data[SC_SERVICE4U].val2
  1156. +sd->sc_data[SC_SERVICE4U].val3);
  1157. if(sd->dsprate<0)sd->dsprate=0;
  1158. }
  1159. if(sd->sc_data[SC_FORTUNE].timer!=-1) // 幸運のキス
  1160. sd->critical += (10+sd->sc_data[SC_FORTUNE].val1+sd->sc_data[SC_FORTUNE].val2
  1161. +sd->sc_data[SC_FORTUNE].val3)*10;
  1162. if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1){ // 爆裂波動
  1163. if(s_class.job==23)
  1164. sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val1*100;
  1165. else
  1166. sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2;
  1167. }
  1168. if(sd->sc_data[SC_STEELBODY].timer!=-1){ // 金剛
  1169. sd->def = 90;
  1170. sd->mdef = 90;
  1171. aspd_rate += 25;
  1172. sd->speed = (sd->speed * 125) / 100;
  1173. }
  1174. if(sd->sc_data[SC_DEFENDER].timer != -1) {
  1175. sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1*50);
  1176. // removed as of 12/14's patch [celest]
  1177. //sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100;
  1178. }
  1179. if(sd->sc_data[SC_ENCPOISON].timer != -1)
  1180. sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2;
  1181. if( sd->sc_data[SC_DANCING].timer!=-1 ){ // 演奏/ダンス使用中
  1182. sd->speed = (double)sd->speed * (6.- 0.4 * pc_checkskill(sd, ((s_class.job == 19) ? BA_MUSICALLESSON : DC_DANCINGLESSON)));
  1183. //sd->speed*=4;
  1184. sd->nhealsp = 0;
  1185. sd->nshealsp = 0;
  1186. sd->nsshealsp = 0;
  1187. }
  1188. if(sd->sc_data[SC_CURSE].timer!=-1)
  1189. sd->speed += 450;
  1190. if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //トゥル?サイト
  1191. sd->critical += sd->critical*(sd->sc_data[SC_TRUESIGHT].val1)/100;
  1192. /* if(sd->sc_data[SC_VOLCANO].timer!=-1) // エンチャントポイズン(?性はbattle.cで)
  1193. sd->addeff[2]+=sd->sc_data[SC_VOLCANO].val2;//% of granting
  1194. if(sd->sc_data[SC_DELUGE].timer!=-1) // エンチャントポイズン(?性はbattle.cで)
  1195. sd->addeff[0]+=sd->sc_data[SC_DELUGE].val2;//% of granting
  1196. */
  1197. if(sd->sc_data[SC_BERSERK].timer!=-1) { //All Def/MDef reduced to 0 while in Berserk [DracoRPG]
  1198. sd->def = sd->def2 = 0;
  1199. sd->mdef = sd->mdef2 = 0;
  1200. sd->flee -= sd->flee*50/100;
  1201. aspd_rate -= 30;
  1202. //sd->base_atk *= 3;
  1203. }
  1204. if(sd->sc_data[SC_KEEPING].timer!=-1)
  1205. sd->def = 100;
  1206. if(sd->sc_data[SC_BARRIER].timer!=-1)
  1207. sd->mdef = 100;
  1208. if(sd->sc_data[SC_JOINTBEAT].timer!=-1) { // Random break [DracoRPG]
  1209. switch(sd->sc_data[SC_JOINTBEAT].val2) {
  1210. case 1: //Ankle break
  1211. sd->speed_rate += 50;
  1212. break;
  1213. case 2: //Wrist break
  1214. sd->aspd_rate += 25;
  1215. break;
  1216. case 3: //Knee break
  1217. sd->speed_rate += 30;
  1218. sd->aspd_rate += 10;
  1219. break;
  1220. case 4: //Shoulder break
  1221. sd->def2 -= sd->def2*50/100;
  1222. break;
  1223. case 5: //Waist break
  1224. sd->def2 -= sd->def2*50/100;
  1225. sd->base_atk -= sd->base_atk*25/100;
  1226. break;
  1227. }
  1228. }
  1229. if(sd->sc_data[SC_GOSPEL].timer!=-1) {
  1230. if (sd->sc_data[SC_GOSPEL].val4 == BCT_PARTY){
  1231. switch (sd->sc_data[SC_GOSPEL].val3)
  1232. {
  1233. case 4:
  1234. sd->status.max_hp += sd->status.max_hp * 25 / 100;
  1235. if(sd->status.max_hp > battle_config.max_hp)
  1236. sd->status.max_hp = battle_config.max_hp;
  1237. break;
  1238. case 5:
  1239. sd->status.max_sp += sd->status.max_sp * 25 / 100;
  1240. if(sd->status.max_sp > battle_config.max_sp)
  1241. sd->status.max_sp = battle_config.max_sp;
  1242. break;
  1243. case 11:
  1244. sd->def += sd->def * 25 / 100;
  1245. sd->def2 += sd->def2 * 25 / 100;
  1246. break;
  1247. case 12:
  1248. sd->base_atk += sd->base_atk * 8 / 100;
  1249. break;
  1250. case 13:
  1251. sd->flee += sd->flee * 5 / 100;
  1252. break;
  1253. case 14:
  1254. sd->hit += sd->hit * 5 / 100;
  1255. break;
  1256. }
  1257. } else if (sd->sc_data[SC_GOSPEL].val4 == BCT_ENEMY){
  1258. switch (sd->sc_data[SC_GOSPEL].val3)
  1259. {
  1260. case 5:
  1261. sd->def = 0;
  1262. sd->def2 = 0;
  1263. break;
  1264. case 6:
  1265. sd->base_atk = 0;
  1266. sd->watk = 0;
  1267. sd->watk2 = 0;
  1268. break;
  1269. case 7:
  1270. sd->flee = 0;
  1271. break;
  1272. case 8:
  1273. sd->speed_rate += 75;
  1274. aspd_rate += 75;
  1275. break;
  1276. }
  1277. }
  1278. }
  1279. }
  1280. if (sd->speed_rate <= 0)
  1281. sd->speed_rate = 1;
  1282. if(sd->speed_rate != 100)
  1283. sd->speed = sd->speed*sd->speed_rate/100;
  1284. if(sd->speed < 1) sd->speed = 1;
  1285. if(aspd_rate != 100)
  1286. sd->aspd = sd->aspd*aspd_rate/100;
  1287. if(pc_isriding(sd)) // 騎兵修練
  1288. sd->aspd = sd->aspd*(100 + 10*(5 - pc_checkskill(sd,KN_CAVALIERMASTERY)))/ 100;
  1289. if(sd->aspd < battle_config.max_aspd) sd->aspd = battle_config.max_aspd;
  1290. sd->amotion = sd->aspd;
  1291. sd->dmotion = 800-sd->paramc[1]*4;
  1292. if(sd->dmotion<400)
  1293. sd->dmotion = 400;
  1294. if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
  1295. sd->prev_speed = sd->speed;
  1296. sd->speed = sd->speed*(175 - skill*5)/100;
  1297. }
  1298. if(sd->status.hp>sd->status.max_hp)
  1299. sd->status.hp=sd->status.max_hp;
  1300. if(sd->status.sp>sd->status.max_sp)
  1301. sd->status.sp=sd->status.max_sp;
  1302. if(first&4)
  1303. return 0;
  1304. if(first&3) {
  1305. clif_updatestatus(sd,SP_SPEED);
  1306. clif_updatestatus(sd,SP_MAXHP);
  1307. clif_updatestatus(sd,SP_MAXSP);
  1308. if(first&1) {
  1309. clif_updatestatus(sd,SP_HP);
  1310. clif_updatestatus(sd,SP_SP);
  1311. }
  1312. return 0;
  1313. }
  1314. if(b_class != sd->view_class) {
  1315. clif_changelook(&sd->bl,LOOK_BASE,sd->view_class);
  1316. #if PACKETVER < 4
  1317. clif_changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon);
  1318. clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield);
  1319. #else
  1320. clif_changelook(&sd->bl,LOOK_WEAPON,0);
  1321. #endif
  1322. }
  1323. if( memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill)) || b_attackrange != sd->attackrange)
  1324. clif_skillinfoblock(sd); // スキル送信
  1325. if(b_speed != sd->speed)
  1326. clif_updatestatus(sd,SP_SPEED);
  1327. if(b_weight != sd->weight)
  1328. clif_updatestatus(sd,SP_WEIGHT);
  1329. if(b_max_weight != sd->max_weight) {
  1330. clif_updatestatus(sd,SP_MAXWEIGHT);
  1331. pc_checkweighticon(sd);
  1332. }
  1333. for(i=0;i<6;i++)
  1334. if(b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i])
  1335. clif_updatestatus(sd,SP_STR+i);
  1336. if(b_hit != sd->hit)
  1337. clif_updatestatus(sd,SP_HIT);
  1338. if(b_flee != sd->flee)
  1339. clif_updatestatus(sd,SP_FLEE1);
  1340. if(b_aspd != sd->aspd)
  1341. clif_updatestatus(sd,SP_ASPD);
  1342. if(b_watk != sd->watk || b_base_atk != sd->base_atk)
  1343. clif_updatestatus(sd,SP_ATK1);
  1344. if(b_def != sd->def)
  1345. clif_updatestatus(sd,SP_DEF1);
  1346. if(b_watk2 != sd->watk2)
  1347. clif_updatestatus(sd,SP_ATK2);
  1348. if(b_def2 != sd->def2)
  1349. clif_updatestatus(sd,SP_DEF2);
  1350. if(b_flee2 != sd->flee2)
  1351. clif_updatestatus(sd,SP_FLEE2);
  1352. if(b_critical != sd->critical)
  1353. clif_updatestatus(sd,SP_CRITICAL);
  1354. if(b_matk1 != sd->matk1)
  1355. clif_updatestatus(sd,SP_MATK1);
  1356. if(b_matk2 != sd->matk2)
  1357. clif_updatestatus(sd,SP_MATK2);
  1358. if(b_mdef != sd->mdef)
  1359. clif_updatestatus(sd,SP_MDEF1);
  1360. if(b_mdef2 != sd->mdef2)
  1361. clif_updatestatus(sd,SP_MDEF2);
  1362. if(b_attackrange != sd->attackrange)
  1363. clif_updatestatus(sd,SP_ATTACKRANGE);
  1364. if(b_max_hp != sd->status.max_hp)
  1365. clif_updatestatus(sd,SP_MAXHP);
  1366. if(b_max_sp != sd->status.max_sp)
  1367. clif_updatestatus(sd,SP_MAXSP);
  1368. if(b_hp != sd->status.hp)
  1369. clif_updatestatus(sd,SP_HP);
  1370. if(b_sp != sd->status.sp)
  1371. clif_updatestatus(sd,SP_SP);
  1372. /* if(before.cart_num != before.cart_num || before.cart_max_num != before.cart_max_num ||
  1373. before.cart_weight != before.cart_weight || before.cart_max_weight != before.cart_max_weight )
  1374. clif_updatestatus(sd,SP_CARTINFO);*/
  1375. //if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 &&
  1376. if(sd->status.hp<sd->status.max_hp>>2 && sd->sc_data[SC_AUTOBERSERK].timer != -1 &&
  1377. (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ) && !pc_isdead(sd))
  1378. // オ?トバ?サ?ク?動
  1379. status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0);
  1380. return 0;
  1381. }
  1382. /*==========================================
  1383. * For quick calculating [Celest]
  1384. *------------------------------------------
  1385. */
  1386. int status_calc_speed (struct map_session_data *sd)
  1387. {
  1388. int b_speed, skill;
  1389. struct pc_base_job s_class;
  1390. nullpo_retr(0, sd);
  1391. s_class = pc_calc_base_job(sd->status.class_);
  1392. b_speed = sd->speed;
  1393. sd->speed = DEFAULT_WALK_SPEED ;
  1394. if(sd->sc_count){
  1395. if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // 速度?加
  1396. sd->speed -= sd->speed *25/100;
  1397. }
  1398. if(sd->sc_data[SC_DECREASEAGI].timer!=-1) {
  1399. sd->speed = sd->speed *125/100;
  1400. }
  1401. if(sd->sc_data[SC_CLOAKING].timer!=-1) {
  1402. sd->speed = sd->speed * (sd->sc_data[SC_CLOAKING].val3-sd->sc_data[SC_CLOAKING].val1*3) /100;
  1403. }
  1404. if(sd->sc_data[SC_CHASEWALK].timer!=-1) {
  1405. sd->speed = sd->speed * sd->sc_data[SC_CHASEWALK].val3 /100;
  1406. }
  1407. if(sd->sc_data[SC_QUAGMIRE].timer!=-1){
  1408. sd->speed = sd->speed*3/2;
  1409. }
  1410. if(sd->sc_data[SC_WINDWALK].timer!=-1 && sd->sc_data[SC_INCREASEAGI].timer==-1) {
  1411. sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100;
  1412. }
  1413. if(sd->sc_data[SC_CARTBOOST].timer!=-1) {
  1414. sd->speed -= (DEFAULT_WALK_SPEED * 20)/100;
  1415. }
  1416. if(sd->sc_data[SC_BERSERK].timer!=-1) {
  1417. sd->speed -= sd->speed *25/100;
  1418. }
  1419. if(sd->sc_data[SC_WEDDING].timer!=-1) {
  1420. sd->speed = 2*DEFAULT_WALK_SPEED;
  1421. }
  1422. if(sd->sc_data[SC_DONTFORGETME].timer!=-1){
  1423. sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100;
  1424. }
  1425. if(sd->sc_data[SC_STEELBODY].timer!=-1){
  1426. sd->speed = (sd->speed * 125) / 100;
  1427. }
  1428. if(sd->sc_data[SC_DEFENDER].timer != -1) {
  1429. // removed as of 12/14's patch [celest]
  1430. //sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100;
  1431. }
  1432. if( sd->sc_data[SC_DANCING].timer!=-1 ){
  1433. sd->speed = (double)sd->speed * (6.- 0.4 * pc_checkskill(sd, ((s_class.job == 19) ? BA_MUSICALLESSON : DC_DANCINGLESSON)));
  1434. }
  1435. if(sd->sc_data[SC_CURSE].timer!=-1)
  1436. sd->speed += 450;
  1437. if(sd->sc_data[SC_SLOWDOWN].timer!=-1)
  1438. sd->speed = sd->speed*150/100;
  1439. if(sd->sc_data[SC_SPEEDUP0].timer!=-1)
  1440. sd->speed -= sd->speed*25/100;
  1441. }
  1442. if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 )
  1443. sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9);
  1444. if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0)
  1445. sd->speed += (10-skill) * (DEFAULT_WALK_SPEED * 0.1);
  1446. else if (pc_isriding(sd)) {
  1447. sd->speed -= (0.25 * DEFAULT_WALK_SPEED);
  1448. }
  1449. if((skill=pc_checkskill(sd,TF_MISS))>0)
  1450. if(s_class.job==12)
  1451. sd->speed -= sd->speed *(skill*1.5)/100;
  1452. if(sd->speed_rate != 100)
  1453. sd->speed = sd->speed*sd->speed_rate/100;
  1454. if(sd->speed < 1) sd->speed = 1;
  1455. if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) {
  1456. sd->prev_speed = sd->speed;
  1457. sd->speed = sd->speed*(175 - skill*5)/100;
  1458. }
  1459. if(b_speed != sd->speed)
  1460. clif_updatestatus(sd,SP_SPEED);
  1461. return 0;
  1462. }
  1463. /*==========================================
  1464. * 対象のClassを返す(汎用)
  1465. * 戻りは整数で0以上
  1466. *------------------------------------------
  1467. */
  1468. int status_get_class(struct block_list *bl)
  1469. {
  1470. nullpo_retr(0, bl);
  1471. if(bl->type==BL_MOB && (struct mob_data *)bl)
  1472. return ((struct mob_data *)bl)->class_;
  1473. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  1474. return ((struct map_session_data *)bl)->status.class_;
  1475. else if(bl->type==BL_PET && (struct pet_data *)bl)
  1476. return ((struct pet_data *)bl)->class_;
  1477. else
  1478. return 0;
  1479. }
  1480. /*==========================================
  1481. * 対象の方向を返す(汎用)
  1482. * 戻りは整数で0以上
  1483. *------------------------------------------
  1484. */
  1485. int status_get_dir(struct block_list *bl)
  1486. {
  1487. nullpo_retr(0, bl);
  1488. if(bl->type==BL_MOB && (struct mob_data *)bl)
  1489. return ((struct mob_data *)bl)->dir;
  1490. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  1491. return ((struct map_session_data *)bl)->dir;
  1492. else if(bl->type==BL_PET && (struct pet_data *)bl)
  1493. return ((struct pet_data *)bl)->dir;
  1494. else
  1495. return 0;
  1496. }
  1497. /*==========================================
  1498. * 対象のレベルを返す(汎用)
  1499. * 戻りは整数で0以上
  1500. *------------------------------------------
  1501. */
  1502. int status_get_lv(struct block_list *bl)
  1503. {
  1504. nullpo_retr(0, bl);
  1505. if(bl->type==BL_MOB && (struct mob_data *)bl)
  1506. return ((struct mob_data *)bl)->level;
  1507. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  1508. return ((struct map_session_data *)bl)->status.base_level;
  1509. else if(bl->type==BL_PET && (struct pet_data *)bl)
  1510. return ((struct pet_data *)bl)->msd->pet.level;
  1511. else
  1512. return 0;
  1513. }
  1514. /*==========================================
  1515. * 対象の射程を返す(汎用)
  1516. * 戻りは整数で0以上
  1517. *------------------------------------------
  1518. */
  1519. int status_get_range(struct block_list *bl)
  1520. {
  1521. nullpo_retr(0, bl);
  1522. if(bl->type==BL_MOB && (struct mob_data *)bl)
  1523. return mob_db[((struct mob_data *)bl)->class_].range;
  1524. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  1525. return ((struct map_session_data *)bl)->attackrange;
  1526. else if(bl->type==BL_PET && (struct pet_data *)bl)
  1527. return mob_db[((struct pet_data *)bl)->class_].range;
  1528. else
  1529. return 0;
  1530. }
  1531. /*==========================================
  1532. * 対象のHPを返す(汎用)
  1533. * 戻りは整数で0以上
  1534. *------------------------------------------
  1535. */
  1536. int status_get_hp(struct block_list *bl)
  1537. {
  1538. nullpo_retr(1, bl);
  1539. if(bl->type==BL_MOB && (struct mob_data *)bl)
  1540. return ((struct mob_data *)bl)->hp;
  1541. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  1542. return ((struct map_session_data *)bl)->status.hp;
  1543. else
  1544. return 1;
  1545. }
  1546. /*==========================================
  1547. * 対象のMHPを返す(汎用)
  1548. * 戻りは整数で0以上
  1549. *------------------------------------------
  1550. */
  1551. int status_get_max_hp(struct block_list *bl)
  1552. {
  1553. nullpo_retr(1, bl);
  1554. if(bl->type==BL_PC && ((struct map_session_data *)bl))
  1555. return ((struct map_session_data *)bl)->status.max_hp;
  1556. else {
  1557. struct status_change *sc_data;
  1558. int max_hp = 1;
  1559. if(bl->type == BL_MOB) {
  1560. struct mob_data *md;
  1561. nullpo_retr(1, md = (struct mob_data *)bl);
  1562. max_hp = mob_db[md->class_].max_hp;
  1563. if(battle_config.mobs_level_up) // mobs leveling up increase [Valaris]
  1564. max_hp += (md->level - mob_db[md->class_].lv) * status_get_vit(bl);
  1565. if(mob_db[md->class_].mexp > 0) {
  1566. if(battle_config.mvp_hp_rate != 100)
  1567. max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
  1568. }
  1569. else {
  1570. if(battle_config.monster_hp_rate != 100)
  1571. max_hp = (max_hp * battle_config.monster_hp_rate)/100;
  1572. }
  1573. }
  1574. else if(bl->type == BL_PET) {
  1575. struct pet_data *pd;
  1576. nullpo_retr(1, pd = (struct pet_data*)bl);
  1577. max_hp = mob_db[pd->class_].max_hp;
  1578. if(mob_db[pd->class_].mexp > 0) {
  1579. if(battle_config.mvp_hp_rate != 100)
  1580. max_hp = (max_hp * battle_config.mvp_hp_rate)/100;
  1581. }
  1582. else {
  1583. if(battle_config.monster_hp_rate != 100)
  1584. max_hp = (max_hp * battle_config.monster_hp_rate)/100;
  1585. }
  1586. }
  1587. sc_data = status_get_sc_data(bl);
  1588. if(sc_data) {
  1589. if(sc_data[SC_APPLEIDUN].timer != -1)
  1590. max_hp += ((5 + sc_data[SC_APPLEIDUN].val1 * 2 + ((sc_data[SC_APPLEIDUN].val2 + 1) >> 1)
  1591. + sc_data[SC_APPLEIDUN].val3 / 10) * max_hp)/100;
  1592. if(sc_data[SC_GOSPEL].timer != -1 &&
  1593. sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
  1594. sc_data[SC_GOSPEL].val3 == 4)
  1595. max_hp += max_hp * 25 / 100;
  1596. }
  1597. if(max_hp < 1) max_hp = 1;
  1598. return max_hp;
  1599. }
  1600. return 1;
  1601. }
  1602. /*==========================================
  1603. * 対象のStrを返す(汎用)
  1604. * 戻りは整数で0以上
  1605. *------------------------------------------
  1606. */
  1607. int status_get_str(struct block_list *bl)
  1608. {
  1609. int str = 0;
  1610. nullpo_retr(0, bl);
  1611. if (bl->type == BL_PC && ((struct map_session_data *)bl))
  1612. return ((struct map_session_data *)bl)->paramc[0];
  1613. else {
  1614. struct status_change *sc_data;
  1615. sc_data = status_get_sc_data(bl);
  1616. if(bl->type == BL_MOB && ((struct mob_data *)bl)) {
  1617. str = mob_db[((struct mob_data *)bl)->class_].str;
  1618. if(battle_config.mobs_level_up) // mobs leveling up increase [Valaris]
  1619. str += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
  1620. }
  1621. else if(bl->type == BL_PET && ((struct pet_data *)bl))
  1622. str = mob_db[((struct pet_data *)bl)->class_].str;
  1623. if(sc_data) {
  1624. if(sc_data[SC_LOUD].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1)
  1625. str += 4;
  1626. if( sc_data[SC_BLESSING].timer != -1){ // ブレッシング
  1627. int race = status_get_race(bl);
  1628. if(battle_check_undead(race,status_get_elem_type(bl)) || race == 6)
  1629. str >>= 1; // 悪 魔/不死
  1630. else str += sc_data[SC_BLESSING].val1; // その他
  1631. }
  1632. if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
  1633. str += 5;
  1634. }
  1635. }
  1636. if(str < 0) str = 0;
  1637. return str;
  1638. }
  1639. /*==========================================
  1640. * 対象のAgiを返す(汎用)
  1641. * 戻りは整数で0以上
  1642. *------------------------------------------
  1643. */
  1644. int status_get_agi(struct block_list *bl)
  1645. {
  1646. int agi=0;
  1647. nullpo_retr(0, bl);
  1648. if(bl->type==BL_PC && (struct map_session_data *)bl)
  1649. return ((struct map_session_data *)bl)->paramc[1];
  1650. else {
  1651. struct status_change *sc_data;
  1652. sc_data = status_get_sc_data(bl);
  1653. if(bl->type == BL_MOB && (struct mob_data *)bl) {
  1654. agi = mob_db[((struct mob_data *)bl)->class_].agi;
  1655. if(battle_config.mobs_level_up) // increase of mobs leveling up [Valaris]
  1656. agi += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
  1657. }
  1658. else if(bl->type == BL_PET && (struct pet_data *)bl)
  1659. agi = mob_db[((struct pet_data *)bl)->class_].agi;
  1660. if(sc_data) {
  1661. if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 速度増加(PCはpc.cで)
  1662. agi += 2 + sc_data[SC_INCREASEAGI].val1;
  1663. if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1)
  1664. agi += agi * (2 + sc_data[SC_CONCENTRATE].val1)/100;
  1665. if(sc_data[SC_DECREASEAGI].timer!=-1) // 速度減少
  1666. agi -= 2 + sc_data[SC_DECREASEAGI].val1;
  1667. if(sc_data[SC_QUAGMIRE].timer!=-1 ) { // クァグマイア
  1668. //agi >>= 1;
  1669. //int agib = agi*(sc_data[SC_QUAGMIRE].val1*10)/100;
  1670. //agi -= agib > 50 ? 50 : agib;
  1671. agi -= sc_data[SC_QUAGMIRE].val1*10;
  1672. }
  1673. if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
  1674. agi += 5;
  1675. }
  1676. }
  1677. if(agi < 0) agi = 0;
  1678. return agi;
  1679. }
  1680. /*==========================================
  1681. * 対象のVitを返す(汎用)
  1682. * 戻りは整数で0以上
  1683. *------------------------------------------
  1684. */
  1685. int status_get_vit(struct block_list *bl)
  1686. {
  1687. int vit = 0;
  1688. nullpo_retr(0, bl);
  1689. if(bl->type == BL_PC && (struct map_session_data *)bl)
  1690. return ((struct map_session_data *)bl)->paramc[2];
  1691. else {
  1692. struct status_change *sc_data;
  1693. sc_data = status_get_sc_data(bl);
  1694. if(bl->type == BL_MOB && (struct mob_data *)bl) {
  1695. vit = mob_db[((struct mob_data *)bl)->class_].vit;
  1696. if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
  1697. vit += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
  1698. }
  1699. else if(bl->type == BL_PET && (struct pet_data *)bl)
  1700. vit = mob_db[((struct pet_data *)bl)->class_].vit;
  1701. if(sc_data) {
  1702. if(sc_data[SC_STRIPARMOR].timer != -1)
  1703. vit = vit*60/100;
  1704. if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
  1705. vit += 5;
  1706. }
  1707. }
  1708. if(vit < 0) vit = 0;
  1709. return vit;
  1710. }
  1711. /*==========================================
  1712. * 対象のIntを返す(汎用)
  1713. * 戻りは整数で0以上
  1714. *------------------------------------------
  1715. */
  1716. int status_get_int(struct block_list *bl)
  1717. {
  1718. int int_=0;
  1719. nullpo_retr(0, bl);
  1720. if(bl->type == BL_PC && (struct map_session_data *)bl)
  1721. return ((struct map_session_data *)bl)->paramc[3];
  1722. else {
  1723. struct status_change *sc_data;
  1724. sc_data = status_get_sc_data(bl);
  1725. if(bl->type == BL_MOB && (struct mob_data *)bl){
  1726. int_ = mob_db[((struct mob_data *)bl)->class_].int_;
  1727. if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
  1728. int_ += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
  1729. }
  1730. else if(bl->type == BL_PET && (struct pet_data *)bl)
  1731. int_ = mob_db[((struct pet_data *)bl)->class_].int_;
  1732. if(sc_data) {
  1733. if(sc_data[SC_BLESSING].timer != -1){ // ブレッシング
  1734. int race = status_get_race(bl);
  1735. if(battle_check_undead(race,status_get_elem_type(bl)) || race == 6 )
  1736. int_ >>= 1; // 悪 魔/不死
  1737. else
  1738. int_ += sc_data[SC_BLESSING].val1; // その他
  1739. }
  1740. if(sc_data[SC_STRIPHELM].timer != -1)
  1741. int_ = int_*60/100;
  1742. if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
  1743. int_ += 5;
  1744. }
  1745. }
  1746. if(int_ < 0) int_ = 0;
  1747. return int_;
  1748. }
  1749. /*==========================================
  1750. * 対象のDexを返す(汎用)
  1751. * 戻りは整数で0以上
  1752. *------------------------------------------
  1753. */
  1754. int status_get_dex(struct block_list *bl)
  1755. {
  1756. int dex = 0;
  1757. nullpo_retr(0, bl);
  1758. if(bl->type==BL_PC && (struct map_session_data *)bl)
  1759. return ((struct map_session_data *)bl)->paramc[4];
  1760. else {
  1761. struct status_change *sc_data;
  1762. sc_data = status_get_sc_data(bl);
  1763. if(bl->type == BL_MOB && (struct mob_data *)bl) {
  1764. dex = mob_db[((struct mob_data *)bl)->class_].dex;
  1765. if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
  1766. dex += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
  1767. }
  1768. else if(bl->type == BL_PET && (struct pet_data *)bl)
  1769. dex = mob_db[((struct pet_data *)bl)->class_].dex;
  1770. if(sc_data) {
  1771. if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1)
  1772. dex += dex*(2+sc_data[SC_CONCENTRATE].val1)/100;
  1773. if(sc_data[SC_BLESSING].timer != -1){ // ブレッシング
  1774. int race = status_get_race(bl);
  1775. if(battle_check_undead(race,status_get_elem_type(bl)) || race == 6 )
  1776. dex >>= 1; // 悪 魔/不死
  1777. else dex += sc_data[SC_BLESSING].val1; // その他
  1778. }
  1779. if(sc_data[SC_QUAGMIRE].timer!=-1) { // クァグマイア
  1780. // dex >>= 1;
  1781. //int dexb = dex*(sc_data[SC_QUAGMIRE].val1*10)/100;
  1782. //dex -= dexb > 50 ? 50 : dexb;
  1783. dex -= sc_data[SC_QUAGMIRE].val1*10;
  1784. }
  1785. if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
  1786. dex += 5;
  1787. }
  1788. }
  1789. if(dex < 0) dex = 0;
  1790. return dex;
  1791. }
  1792. /*==========================================
  1793. * 対象のLukを返す(汎用)
  1794. * 戻りは整数で0以上
  1795. *------------------------------------------
  1796. */
  1797. int status_get_luk(struct block_list *bl)
  1798. {
  1799. int luk = 0;
  1800. nullpo_retr(0, bl);
  1801. if(bl->type == BL_PC && (struct map_session_data *)bl)
  1802. return ((struct map_session_data *)bl)->paramc[5];
  1803. else {
  1804. struct status_change *sc_data;
  1805. sc_data = status_get_sc_data(bl);
  1806. if(bl->type == BL_MOB && (struct mob_data *)bl) {
  1807. luk = mob_db[((struct mob_data *)bl)->class_].luk;
  1808. if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
  1809. luk += ((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
  1810. }
  1811. else if(bl->type == BL_PET && (struct pet_data *)bl)
  1812. luk = mob_db[((struct pet_data *)bl)->class_].luk;
  1813. if(sc_data) {
  1814. if(sc_data[SC_GLORIA].timer!=-1) // グロリア(PCはpc.cで)
  1815. luk += 30;
  1816. if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
  1817. luk += 5;
  1818. if(sc_data[SC_CURSE].timer!=-1) // 呪い
  1819. luk = 0;
  1820. }
  1821. }
  1822. if(luk < 0) luk = 0;
  1823. return luk;
  1824. }
  1825. /*==========================================
  1826. * 対象のFleeを返す(汎用)
  1827. * 戻りは整数で1以上
  1828. *------------------------------------------
  1829. */
  1830. int status_get_flee(struct block_list *bl)
  1831. {
  1832. int flee = 1;
  1833. nullpo_retr(1, bl);
  1834. if(bl->type == BL_PC && (struct map_session_data *)bl)
  1835. return ((struct map_session_data *)bl)->flee;
  1836. else {
  1837. struct status_change *sc_data;
  1838. sc_data = status_get_sc_data(bl);
  1839. flee = status_get_agi(bl) + status_get_lv(bl);
  1840. if(sc_data){
  1841. if(sc_data[SC_WHISTLE].timer!=-1)
  1842. flee += flee*(sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
  1843. +(sc_data[SC_WHISTLE].val3>>16))/100;
  1844. if(sc_data[SC_BLIND].timer!=-1)
  1845. flee -= flee*25/100;
  1846. if(sc_data[SC_WINDWALK].timer!=-1) // ウィンドウォーク
  1847. flee += flee*(sc_data[SC_WINDWALK].val2)/100;
  1848. if(sc_data[SC_SPIDERWEB].timer!=-1) //スパイダーウェブ
  1849. flee -= flee*50/100;
  1850. if(sc_data[SC_GOSPEL].timer!=-1) {
  1851. if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
  1852. sc_data[SC_GOSPEL].val3 == 13)
  1853. flee += flee*5/100;
  1854. else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
  1855. sc_data[SC_GOSPEL].val3 == 7)
  1856. flee = 0;
  1857. }
  1858. }
  1859. }
  1860. if(flee < 1) flee = 1;
  1861. return flee;
  1862. }
  1863. /*==========================================
  1864. * 対象のHitを返す(汎用)
  1865. * 戻りは整数で1以上
  1866. *------------------------------------------
  1867. */
  1868. int status_get_hit(struct block_list *bl)
  1869. {
  1870. int hit = 1;
  1871. nullpo_retr(1, bl);
  1872. if(bl->type == BL_PC && (struct map_session_data *)bl)
  1873. return ((struct map_session_data *)bl)->hit;
  1874. else {
  1875. struct status_change *sc_data;
  1876. sc_data = status_get_sc_data(bl);
  1877. hit = status_get_dex(bl) + status_get_lv(bl);
  1878. if(sc_data) {
  1879. if(sc_data[SC_HUMMING].timer!=-1) //
  1880. hit += hit*(sc_data[SC_HUMMING].val1*2+sc_data[SC_HUMMING].val2
  1881. +sc_data[SC_HUMMING].val3)/100;
  1882. if(sc_data[SC_BLIND].timer!=-1) // 呪い
  1883. hit -= hit*25/100;
  1884. if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト
  1885. hit += 3*(sc_data[SC_TRUESIGHT].val1);
  1886. if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション
  1887. hit += (hit*(10*(sc_data[SC_CONCENTRATION].val1)))/100;
  1888. if(sc_data[SC_GOSPEL].timer!=-1 &&
  1889. sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
  1890. sc_data[SC_GOSPEL].val3 == 14)
  1891. hit += hit*5/100;
  1892. }
  1893. }
  1894. if(hit < 1) hit = 1;
  1895. return hit;
  1896. }
  1897. /*==========================================
  1898. * 対象の完全回避を返す(汎用)
  1899. * 戻りは整数で1以上
  1900. *------------------------------------------
  1901. */
  1902. int status_get_flee2(struct block_list *bl)
  1903. {
  1904. int flee2 = 1;
  1905. nullpo_retr(1, bl);
  1906. if(bl->type==BL_PC && (struct map_session_data *)bl){
  1907. return ((struct map_session_data *)bl)->flee2;
  1908. } else {
  1909. struct status_change *sc_data;
  1910. sc_data = status_get_sc_data(bl);
  1911. flee2 = status_get_luk(bl)+1;
  1912. if(sc_data) {
  1913. if(sc_data[SC_WHISTLE].timer!=-1)
  1914. flee2 += (sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2
  1915. +(sc_data[SC_WHISTLE].val3&0xffff))*10;
  1916. }
  1917. }
  1918. if(flee2 < 1) flee2 = 1;
  1919. return flee2;
  1920. }
  1921. /*==========================================
  1922. * 対象のクリティカルを返す(汎用)
  1923. * 戻りは整数で1以上
  1924. *------------------------------------------
  1925. */
  1926. int status_get_critical(struct block_list *bl)
  1927. {
  1928. int critical = 1;
  1929. nullpo_retr(1, bl);
  1930. if(bl->type == BL_PC && (struct map_session_data *)bl){
  1931. return ((struct map_session_data *)bl)->critical;
  1932. } else {
  1933. struct status_change *sc_data;
  1934. sc_data = status_get_sc_data(bl);
  1935. critical = status_get_luk(bl)*3 + 1;
  1936. if(sc_data) {
  1937. if(sc_data[SC_FORTUNE].timer!=-1)
  1938. critical += (10+sc_data[SC_FORTUNE].val1+sc_data[SC_FORTUNE].val2
  1939. + sc_data[SC_FORTUNE].val3)*10;
  1940. if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1)
  1941. critical += sc_data[SC_EXPLOSIONSPIRITS].val2;
  1942. if(sc_data[SC_TRUESIGHT].timer!=-1) //トゥルーサイト
  1943. critical += critical*sc_data[SC_TRUESIGHT].val1/100;
  1944. }
  1945. }
  1946. if(critical < 1) critical = 1;
  1947. return critical;
  1948. }
  1949. /*==========================================
  1950. * base_atkの取得
  1951. * 戻りは整数で1以上
  1952. *------------------------------------------
  1953. */
  1954. int status_get_baseatk(struct block_list *bl)
  1955. {
  1956. int batk = 1;
  1957. nullpo_retr(1, bl);
  1958. if(bl->type==BL_PC && (struct map_session_data *)bl) {
  1959. batk = ((struct map_session_data *)bl)->base_atk; //設定されているbase_atk
  1960. if (((struct map_session_data *)bl)->status.weapon < 16)
  1961. batk += ((struct map_session_data *)bl)->weapon_atk[((struct map_session_data *)bl)->status.weapon];
  1962. } else { //それ以外なら
  1963. struct status_change *sc_data;
  1964. int str,dstr;
  1965. str = status_get_str(bl); //STR
  1966. dstr = str/10;
  1967. batk = dstr*dstr + str; //base_atkを計算する
  1968. sc_data = status_get_sc_data(bl);
  1969. if(sc_data) { //状態異常あり
  1970. if(sc_data[SC_PROVOKE].timer!=-1) //PCでプロボック(SM_PROVOKE)状態
  1971. batk = batk*(100+2*sc_data[SC_PROVOKE].val1)/100; //base_atk増加
  1972. if(sc_data[SC_CURSE].timer!=-1) //呪われていたら
  1973. batk -= batk*25/100; //base_atkが25%減少
  1974. if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション
  1975. batk += batk*(5*sc_data[SC_CONCENTRATION].val1)/100;
  1976. }
  1977. }
  1978. if(batk < 1) batk = 1; //base_atkは最低でも1
  1979. return batk;
  1980. }
  1981. /*==========================================
  1982. * 対象のAtkを返す(汎用)
  1983. * 戻りは整数で0以上
  1984. *------------------------------------------
  1985. */
  1986. int status_get_atk(struct block_list *bl)
  1987. {
  1988. int atk = 0;
  1989. nullpo_retr(0, bl);
  1990. if(bl->type==BL_PC && (struct map_session_data *)bl)
  1991. return ((struct map_session_data*)bl)->watk;
  1992. else {
  1993. struct status_change *sc_data;
  1994. sc_data=status_get_sc_data(bl);
  1995. if(bl->type == BL_MOB && (struct mob_data *)bl)
  1996. atk = mob_db[((struct mob_data*)bl)->class_].atk1;
  1997. else if(bl->type == BL_PET && (struct pet_data *)bl)
  1998. atk = mob_db[((struct pet_data*)bl)->class_].atk1;
  1999. if(sc_data) {
  2000. if(sc_data[SC_PROVOKE].timer!=-1)
  2001. atk = atk*(100+2*sc_data[SC_PROVOKE].val1)/100;
  2002. if(sc_data[SC_CURSE].timer!=-1)
  2003. atk -= atk*25/100;
  2004. if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション
  2005. atk += atk*(5*sc_data[SC_CONCENTRATION].val1)/100;
  2006. if(sc_data[SC_GOSPEL].timer!=-1) {
  2007. if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
  2008. sc_data[SC_GOSPEL].val3 == 12)
  2009. atk += atk*8/100;
  2010. else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
  2011. sc_data[SC_GOSPEL].val3 == 6)
  2012. atk = 0;
  2013. }
  2014. }
  2015. }
  2016. if(atk < 0) atk = 0;
  2017. return atk;
  2018. }
  2019. /*==========================================
  2020. * 対象の左手Atkを返す(汎用)
  2021. * 戻りは整数で0以上
  2022. *------------------------------------------
  2023. */
  2024. int status_get_atk_(struct block_list *bl)
  2025. {
  2026. nullpo_retr(0, bl);
  2027. if(bl->type==BL_PC && (struct map_session_data *)bl){
  2028. int atk=((struct map_session_data*)bl)->watk_;
  2029. return atk;
  2030. }
  2031. else
  2032. return 0;
  2033. }
  2034. /*==========================================
  2035. * 対象のAtk2を返す(汎用)
  2036. * 戻りは整数で0以上
  2037. *------------------------------------------
  2038. */
  2039. int status_get_atk2(struct block_list *bl)
  2040. {
  2041. nullpo_retr(0, bl);
  2042. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2043. return ((struct map_session_data*)bl)->watk2;
  2044. else {
  2045. struct status_change *sc_data=status_get_sc_data(bl);
  2046. int atk2=0;
  2047. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2048. atk2 = mob_db[((struct mob_data*)bl)->class_].atk2;
  2049. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2050. atk2 = mob_db[((struct pet_data*)bl)->class_].atk2;
  2051. if(sc_data) {
  2052. if( sc_data[SC_IMPOSITIO].timer!=-1)
  2053. atk2 += sc_data[SC_IMPOSITIO].val1*5;
  2054. if( sc_data[SC_PROVOKE].timer!=-1 )
  2055. atk2 = atk2*(100+2*sc_data[SC_PROVOKE].val1)/100;
  2056. if( sc_data[SC_CURSE].timer!=-1 )
  2057. atk2 -= atk2*25/100;
  2058. if(sc_data[SC_DRUMBATTLE].timer!=-1)
  2059. atk2 += sc_data[SC_DRUMBATTLE].val2;
  2060. if(sc_data[SC_NIBELUNGEN].timer!=-1 && (status_get_element(bl)/10) >= 8 )
  2061. atk2 += sc_data[SC_NIBELUNGEN].val3;
  2062. if(sc_data[SC_STRIPWEAPON].timer!=-1)
  2063. atk2 = atk2*sc_data[SC_STRIPWEAPON].val2/100;
  2064. if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション
  2065. atk2 += atk2*(5*sc_data[SC_CONCENTRATION].val1)/100;
  2066. }
  2067. if(atk2 < 0) atk2 = 0;
  2068. return atk2;
  2069. }
  2070. return 0;
  2071. }
  2072. /*==========================================
  2073. * 対象の左手Atk2を返す(汎用)
  2074. * 戻りは整数で0以上
  2075. *------------------------------------------
  2076. */
  2077. int status_get_atk_2(struct block_list *bl)
  2078. {
  2079. nullpo_retr(0, bl);
  2080. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2081. return ((struct map_session_data*)bl)->watk_2;
  2082. else
  2083. return 0;
  2084. }
  2085. /*==========================================
  2086. * 対象のMAtk1を返す(汎用)
  2087. * 戻りは整数で0以上
  2088. *------------------------------------------
  2089. */
  2090. int status_get_matk1(struct block_list *bl)
  2091. {
  2092. int matk = 0;
  2093. nullpo_retr(0, bl);
  2094. if(bl->type == BL_PC && (struct map_session_data *)bl)
  2095. return ((struct map_session_data *)bl)->matk1;
  2096. else {
  2097. struct status_change *sc_data;
  2098. int int_ = status_get_int(bl);
  2099. matk = int_+(int_/5)*(int_/5);
  2100. sc_data = status_get_sc_data(bl);
  2101. if(sc_data) {
  2102. if(sc_data[SC_MINDBREAKER].timer!=-1)
  2103. matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
  2104. }
  2105. }
  2106. return matk;
  2107. }
  2108. /*==========================================
  2109. * 対象のMAtk2を返す(汎用)
  2110. * 戻りは整数で0以上
  2111. *------------------------------------------
  2112. */
  2113. int status_get_matk2(struct block_list *bl)
  2114. {
  2115. int matk = 0;
  2116. nullpo_retr(0, bl);
  2117. if(bl->type == BL_PC && (struct map_session_data *)bl)
  2118. return ((struct map_session_data *)bl)->matk2;
  2119. else {
  2120. struct status_change *sc_data = status_get_sc_data(bl);
  2121. int int_ = status_get_int(bl);
  2122. matk = int_+(int_/7)*(int_/7);
  2123. if(sc_data) {
  2124. if(sc_data[SC_MINDBREAKER].timer!=-1)
  2125. matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100;
  2126. }
  2127. }
  2128. return matk;
  2129. }
  2130. /*==========================================
  2131. * 対象のDefを返す(汎用)
  2132. * 戻りは整数で0以上
  2133. *------------------------------------------
  2134. */
  2135. int status_get_def(struct block_list *bl)
  2136. {
  2137. struct status_change *sc_data;
  2138. int def=0,skilltimer=-1,skillid=0;
  2139. nullpo_retr(0, bl);
  2140. sc_data=status_get_sc_data(bl);
  2141. if(bl->type==BL_PC && (struct map_session_data *)bl){
  2142. def = ((struct map_session_data *)bl)->def;
  2143. skilltimer = ((struct map_session_data *)bl)->skilltimer;
  2144. skillid = ((struct map_session_data *)bl)->skillid;
  2145. }
  2146. else if(bl->type==BL_MOB && (struct mob_data *)bl) {
  2147. def = mob_db[((struct mob_data *)bl)->class_].def;
  2148. skilltimer = ((struct mob_data *)bl)->skilltimer;
  2149. skillid = ((struct mob_data *)bl)->skillid;
  2150. }
  2151. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2152. def = mob_db[((struct pet_data *)bl)->class_].def;
  2153. if(def < 1000000) {
  2154. if(sc_data) {
  2155. //凍結、石化時は右シフト
  2156. if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
  2157. def >>= 1;
  2158. if (bl->type != BL_PC) {
  2159. //キーピング時はDEF100
  2160. if( sc_data[SC_KEEPING].timer!=-1)
  2161. def = 100;
  2162. //プロボック時は減算
  2163. if( sc_data[SC_PROVOKE].timer!=-1)
  2164. def = (def*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
  2165. //戦太鼓の響き時は加算
  2166. if( sc_data[SC_DRUMBATTLE].timer!=-1)
  2167. def += sc_data[SC_DRUMBATTLE].val3;
  2168. //毒にかかっている時は減算
  2169. if(sc_data[SC_POISON].timer!=-1)
  2170. def = def*75/100;
  2171. //ストリップシールド時は減算
  2172. if(sc_data[SC_STRIPSHIELD].timer!=-1)
  2173. def = def*sc_data[SC_STRIPSHIELD].val2/100;
  2174. //シグナムクルシス時は減算
  2175. if(sc_data[SC_SIGNUMCRUCIS].timer!=-1)
  2176. def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2)/100;
  2177. //永遠の混沌時はDEF0になる
  2178. if(sc_data[SC_ETERNALCHAOS].timer!=-1)
  2179. def = 0;
  2180. //コンセントレーション時は減算
  2181. if( sc_data[SC_CONCENTRATION].timer!=-1)
  2182. def = (def*(100 - 5*sc_data[SC_CONCENTRATION].val1))/100;
  2183. if(sc_data[SC_GOSPEL].timer!=-1) {
  2184. if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
  2185. sc_data[SC_GOSPEL].val3 == 11)
  2186. def += def*25/100;
  2187. else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
  2188. sc_data[SC_GOSPEL].val3 == 5)
  2189. def = 0;
  2190. }
  2191. if(sc_data[SC_JOINTBEAT].timer!=-1) {
  2192. if (sc_data[SC_JOINTBEAT].val2 == 4)
  2193. def -= def*50/100;
  2194. else if (sc_data[SC_JOINTBEAT].val2 == 5)
  2195. def -= def*25/100;
  2196. }
  2197. }
  2198. }
  2199. //詠唱中は詠唱時減算率に基づいて減算
  2200. if(skilltimer != -1) {
  2201. int def_rate = skill_get_castdef(skillid);
  2202. if(def_rate != 0)
  2203. def = (def * (100 - def_rate))/100;
  2204. }
  2205. }
  2206. if(def < 0) def = 0;
  2207. return def;
  2208. }
  2209. /*==========================================
  2210. * 対象のMDefを返す(汎用)
  2211. * 戻りは整数で0以上
  2212. *------------------------------------------
  2213. */
  2214. int status_get_mdef(struct block_list *bl)
  2215. {
  2216. struct status_change *sc_data;
  2217. int mdef=0;
  2218. nullpo_retr(0, bl);
  2219. sc_data=status_get_sc_data(bl);
  2220. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2221. mdef = ((struct map_session_data *)bl)->mdef;
  2222. else if(bl->type==BL_MOB && (struct mob_data *)bl)
  2223. mdef = mob_db[((struct mob_data *)bl)->class_].mdef;
  2224. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2225. mdef = mob_db[((struct pet_data *)bl)->class_].mdef;
  2226. if(mdef < 1000000) {
  2227. if(sc_data) {
  2228. //バリアー状態時はMDEF100
  2229. if(sc_data[SC_BARRIER].timer != -1)
  2230. mdef = 100;
  2231. //凍結、石化時は1.25倍
  2232. if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))
  2233. mdef = mdef*125/100;
  2234. if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC)
  2235. mdef -= (mdef*6*sc_data[SC_MINDBREAKER].val1)/100;
  2236. }
  2237. }
  2238. if(mdef < 0) mdef = 0;
  2239. return mdef;
  2240. }
  2241. /*==========================================
  2242. * 対象のDef2を返す(汎用)
  2243. * 戻りは整数で1以上
  2244. *------------------------------------------
  2245. */
  2246. int status_get_def2(struct block_list *bl)
  2247. {
  2248. int def2 = 1;
  2249. nullpo_retr(1, bl);
  2250. if(bl->type==BL_PC)
  2251. return ((struct map_session_data *)bl)->def2;
  2252. else {
  2253. struct status_change *sc_data;
  2254. if(bl->type==BL_MOB)
  2255. def2 = mob_db[((struct mob_data *)bl)->class_].vit;
  2256. else if(bl->type==BL_PET)
  2257. def2 = mob_db[((struct pet_data *)bl)->class_].vit;
  2258. sc_data = status_get_sc_data(bl);
  2259. if(sc_data) {
  2260. if(sc_data[SC_ANGELUS].timer != -1)
  2261. def2 = def2*(110+5*sc_data[SC_ANGELUS].val1)/100;
  2262. if(sc_data[SC_PROVOKE].timer!=-1)
  2263. def2 = (def2*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100;
  2264. if(sc_data[SC_POISON].timer!=-1)
  2265. def2 = def2*75/100;
  2266. //コンセントレーション時は減算
  2267. if( sc_data[SC_CONCENTRATION].timer!=-1)
  2268. def2 = def2*(100 - 5*sc_data[SC_CONCENTRATION].val1)/100;
  2269. if(sc_data[SC_GOSPEL].timer!=-1) {
  2270. if (sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
  2271. sc_data[SC_GOSPEL].val3 == 11)
  2272. def2 += def2*25/100;
  2273. else if (sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
  2274. sc_data[SC_GOSPEL].val3 == 5)
  2275. def2 = 0;
  2276. }
  2277. }
  2278. }
  2279. if(def2 < 1) def2 = 1;
  2280. return def2;
  2281. }
  2282. /*==========================================
  2283. * 対象のMDef2を返す(汎用)
  2284. * 戻りは整数で0以上
  2285. *------------------------------------------
  2286. */
  2287. int status_get_mdef2(struct block_list *bl)
  2288. {
  2289. int mdef2 = 0;
  2290. nullpo_retr(0, bl);
  2291. if(bl->type == BL_PC)
  2292. return ((struct map_session_data *)bl)->mdef2 + (((struct map_session_data *)bl)->paramc[2]>>1);
  2293. else {
  2294. struct status_change *sc_data = status_get_sc_data(bl);
  2295. if(bl->type == BL_MOB)
  2296. mdef2 = mob_db[((struct mob_data *)bl)->class_].int_ + (mob_db[((struct mob_data *)bl)->class_].vit>>1);
  2297. else if(bl->type == BL_PET)
  2298. mdef2 = mob_db[((struct pet_data *)bl)->class_].int_ + (mob_db[((struct pet_data *)bl)->class_].vit>>1);
  2299. if(sc_data) {
  2300. if(sc_data[SC_MINDBREAKER].timer!=-1)
  2301. mdef2 -= (mdef2*6*sc_data[SC_MINDBREAKER].val1)/100;
  2302. }
  2303. }
  2304. if(mdef2 < 0) mdef2 = 0;
  2305. return mdef2;
  2306. }
  2307. /*==========================================
  2308. * 対象のSpeed(移動速度)を返す(汎用)
  2309. * 戻りは整数で1以上
  2310. * Speedは小さいほうが移動速度が速い
  2311. *------------------------------------------
  2312. */
  2313. int status_get_speed(struct block_list *bl)
  2314. {
  2315. nullpo_retr(1000, bl);
  2316. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2317. return ((struct map_session_data *)bl)->speed;
  2318. else {
  2319. struct status_change *sc_data=status_get_sc_data(bl);
  2320. int speed = 1000;
  2321. if(bl->type==BL_MOB && (struct mob_data *)bl) {
  2322. speed = ((struct mob_data *)bl)->speed;
  2323. if(battle_config.mobs_level_up) // increase from mobs leveling up [Valaris]
  2324. speed-=((struct mob_data *)bl)->level - mob_db[((struct mob_data *)bl)->class_].lv;
  2325. }
  2326. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2327. speed = ((struct pet_data *)bl)->msd->petDB->speed;
  2328. if(sc_data) {
  2329. //速度増加時は25%減算
  2330. if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_DONTFORGETME].timer == -1)
  2331. speed -= speed*25/100;
  2332. //速度減少時は25%加算
  2333. if(sc_data[SC_DECREASEAGI].timer!=-1)
  2334. speed = speed*125/100;
  2335. //クァグマイア時は50%加算
  2336. if(sc_data[SC_QUAGMIRE].timer!=-1)
  2337. speed = speed*3/2;
  2338. //私を忘れないで…時は加算
  2339. if(sc_data[SC_DONTFORGETME].timer!=-1)
  2340. speed = speed*(100+sc_data[SC_DONTFORGETME].val1*2 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3&0xffff))/100;
  2341. //金剛時は25%加算
  2342. if(sc_data[SC_STEELBODY].timer!=-1)
  2343. speed = speed*125/100;
  2344. //ディフェンダー時は加算
  2345. // removed as of 12/14's patch [celest]
  2346. /*if(sc_data[SC_DEFENDER].timer!=-1)
  2347. speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100;*/
  2348. //踊り状態は4倍遅い
  2349. if(sc_data[SC_DANCING].timer!=-1 )
  2350. speed *= 6;
  2351. //呪い時は450加算
  2352. if(sc_data[SC_CURSE].timer!=-1)
  2353. speed = speed + 450;
  2354. //ウィンドウォーク時はLv*2%減算
  2355. if(sc_data[SC_WINDWALK].timer!=-1 && sc_data[SC_INCREASEAGI].timer==-1)
  2356. speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100;
  2357. if(sc_data[SC_SLOWDOWN].timer!=-1)
  2358. speed = speed*150/100;
  2359. if(sc_data[SC_SPEEDUP0].timer!=-1)
  2360. speed -= speed*25/100;
  2361. if(sc_data[SC_GOSPEL].timer!=-1 &&
  2362. sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
  2363. sc_data[SC_GOSPEL].val3 == 8)
  2364. speed = speed*125/100;
  2365. if(sc_data[SC_JOINTBEAT].timer!=-1) {
  2366. if (sc_data[SC_JOINTBEAT].val2 == 1)
  2367. speed = speed*150/100;
  2368. else if (sc_data[SC_JOINTBEAT].val2 == 3)
  2369. speed = speed*130/100;
  2370. }
  2371. }
  2372. if(speed < 1) speed = 1;
  2373. return speed;
  2374. }
  2375. return 1000;
  2376. }
  2377. /*==========================================
  2378. * 対象のaDelay(攻撃時ディレイ)を返す(汎用)
  2379. * aDelayは小さいほうが攻撃速度が速い
  2380. *------------------------------------------
  2381. */
  2382. int status_get_adelay(struct block_list *bl)
  2383. {
  2384. nullpo_retr(4000, bl);
  2385. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2386. return (((struct map_session_data *)bl)->aspd<<1);
  2387. else {
  2388. struct status_change *sc_data=status_get_sc_data(bl);
  2389. int adelay=4000,aspd_rate = 100,i;
  2390. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2391. adelay = mob_db[((struct mob_data *)bl)->class_].adelay;
  2392. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2393. adelay = mob_db[((struct pet_data *)bl)->class_].adelay;
  2394. if(sc_data) {
  2395. //ツーハンドクイッケン使用時でクァグマイアでも私を忘れないで…でもない時は3割減算
  2396. if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
  2397. aspd_rate -= 30;
  2398. //アドレナリンラッシュ使用時でツーハンドクイッケンでもクァグマイアでも私を忘れないで…でもない時は
  2399. if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
  2400. sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ
  2401. //使用者とパーティメンバーで格差が出る設定でなければ3割減算
  2402. if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty)
  2403. aspd_rate -= 30;
  2404. //そうでなければ2.5割減算
  2405. else
  2406. aspd_rate -= 25;
  2407. }
  2408. //スピアクィッケン時は減算
  2409. if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
  2410. sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン
  2411. aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
  2412. //夕日のアサシンクロス時は減算
  2413. if(sc_data[SC_ASSNCROS].timer!=-1 && // 夕陽のアサシンクロス
  2414. sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
  2415. sc_data[SC_DONTFORGETME].timer == -1)
  2416. aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
  2417. //私を忘れないで…時は加算
  2418. if(sc_data[SC_DONTFORGETME].timer!=-1) // 私を忘れないで
  2419. aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
  2420. //金剛時25%加算
  2421. if(sc_data[SC_STEELBODY].timer!=-1) // 金剛
  2422. aspd_rate += 25;
  2423. //増速ポーション使用時は減算
  2424. if( sc_data[i=SC_SPEEDPOTION3].timer!=-1 || sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
  2425. aspd_rate -= sc_data[i].val2;
  2426. //ディフェンダー時は加算
  2427. if(sc_data[SC_DEFENDER].timer != -1)
  2428. adelay += (1100 - sc_data[SC_DEFENDER].val1*100);
  2429. if(sc_data[SC_GOSPEL].timer!=-1 &&
  2430. sc_data[SC_GOSPEL].val4 == BCT_ENEMY &&
  2431. sc_data[SC_GOSPEL].val3 == 8)
  2432. aspd_rate = aspd_rate*125/100;
  2433. if(sc_data[SC_JOINTBEAT].timer!=-1) {
  2434. if (sc_data[SC_JOINTBEAT].val2 == 2)
  2435. aspd_rate = aspd_rate*125/100;
  2436. else if (sc_data[SC_JOINTBEAT].val2 == 3)
  2437. aspd_rate = aspd_rate*110/100;
  2438. }
  2439. }
  2440. if(aspd_rate != 100)
  2441. adelay = adelay*aspd_rate/100;
  2442. if(adelay < battle_config.monster_max_aspd<<1) adelay = battle_config.monster_max_aspd<<1;
  2443. return adelay;
  2444. }
  2445. return 4000;
  2446. }
  2447. int status_get_amotion(struct block_list *bl)
  2448. {
  2449. nullpo_retr(2000, bl);
  2450. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2451. return ((struct map_session_data *)bl)->amotion;
  2452. else {
  2453. struct status_change *sc_data=status_get_sc_data(bl);
  2454. int amotion=2000,aspd_rate = 100,i;
  2455. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2456. amotion = mob_db[((struct mob_data *)bl)->class_].amotion;
  2457. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2458. amotion = mob_db[((struct pet_data *)bl)->class_].amotion;
  2459. if(sc_data) {
  2460. if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ
  2461. aspd_rate -= 30;
  2462. if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 &&
  2463. sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ
  2464. if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penalty)
  2465. aspd_rate -= 30;
  2466. else
  2467. aspd_rate -= 25;
  2468. }
  2469. if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 &&
  2470. sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン
  2471. aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2;
  2472. if(sc_data[SC_ASSNCROS].timer!=-1 && // 夕陽のアサシンクロス
  2473. sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 &&
  2474. sc_data[SC_DONTFORGETME].timer == -1)
  2475. aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3;
  2476. if(sc_data[SC_DONTFORGETME].timer!=-1) // 私を忘れないで
  2477. aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16);
  2478. if(sc_data[SC_STEELBODY].timer!=-1) // 金剛
  2479. aspd_rate += 25;
  2480. if( sc_data[i=SC_SPEEDPOTION3].timer!=-1 || sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1)
  2481. aspd_rate -= sc_data[i].val2;
  2482. if(sc_data[SC_DEFENDER].timer != -1)
  2483. amotion += (550 - sc_data[SC_DEFENDER].val1*50);
  2484. }
  2485. if(aspd_rate != 100)
  2486. amotion = amotion*aspd_rate/100;
  2487. if(amotion < battle_config.monster_max_aspd) amotion = battle_config.monster_max_aspd;
  2488. return amotion;
  2489. }
  2490. return 2000;
  2491. }
  2492. int status_get_dmotion(struct block_list *bl)
  2493. {
  2494. int ret;
  2495. struct status_change *sc_data;
  2496. nullpo_retr(0, bl);
  2497. sc_data = status_get_sc_data(bl);
  2498. if(bl->type==BL_MOB && (struct mob_data *)bl){
  2499. ret=mob_db[((struct mob_data *)bl)->class_].dmotion;
  2500. if(battle_config.monster_damage_delay_rate != 100)
  2501. ret = ret*battle_config.monster_damage_delay_rate/400;
  2502. }
  2503. else if(bl->type==BL_PC && (struct map_session_data *)bl){
  2504. ret=((struct map_session_data *)bl)->dmotion;
  2505. if(battle_config.pc_damage_delay_rate != 100)
  2506. ret = ret*battle_config.pc_damage_delay_rate/400;
  2507. }
  2508. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2509. ret=mob_db[((struct pet_data *)bl)->class_].dmotion;
  2510. else
  2511. return 2000;
  2512. if((sc_data && (sc_data[SC_ENDURE].timer!=-1 || sc_data[SC_BERSERK].timer!=-1)) ||
  2513. (bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.infinite_endure))
  2514. ret=0;
  2515. return ret;
  2516. }
  2517. int status_get_element(struct block_list *bl)
  2518. {
  2519. int ret = 20;
  2520. struct status_change *sc_data;
  2521. nullpo_retr(ret, bl);
  2522. sc_data = status_get_sc_data(bl);
  2523. if(bl->type==BL_MOB && (struct mob_data *)bl) // 10の位=Lv*2、1の位=属性
  2524. ret=((struct mob_data *)bl)->def_ele;
  2525. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2526. ret=20+((struct map_session_data *)bl)->def_ele; // 防御属性Lv1
  2527. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2528. ret = mob_db[((struct pet_data *)bl)->class_].element;
  2529. if(sc_data) {
  2530. if( sc_data[SC_BENEDICTIO].timer!=-1 ) // 聖体降福
  2531. ret=26;
  2532. if( sc_data[SC_FREEZE].timer!=-1 ) // 凍結
  2533. ret=21;
  2534. if( sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0)
  2535. ret=22;
  2536. }
  2537. return ret;
  2538. }
  2539. int status_get_attack_element(struct block_list *bl)
  2540. {
  2541. int ret = 0;
  2542. struct status_change *sc_data=status_get_sc_data(bl);
  2543. nullpo_retr(0, bl);
  2544. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2545. ret=0;
  2546. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2547. ret=((struct map_session_data *)bl)->atk_ele;
  2548. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2549. ret=0;
  2550. if(sc_data) {
  2551. if( sc_data[SC_FROSTWEAPON].timer!=-1) // フロストウェポン
  2552. ret=1;
  2553. if( sc_data[SC_SEISMICWEAPON].timer!=-1) // サイズミックウェポン
  2554. ret=2;
  2555. if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // フレームランチャー
  2556. ret=3;
  2557. if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ライトニングローダー
  2558. ret=4;
  2559. if( sc_data[SC_ENCPOISON].timer!=-1) // エンチャントポイズン
  2560. ret=5;
  2561. if( sc_data[SC_ASPERSIO].timer!=-1) // アスペルシオ
  2562. ret=6;
  2563. }
  2564. return ret;
  2565. }
  2566. int status_get_attack_element2(struct block_list *bl)
  2567. {
  2568. nullpo_retr(0, bl);
  2569. if(bl->type==BL_PC && (struct map_session_data *)bl) {
  2570. int ret = ((struct map_session_data *)bl)->atk_ele_;
  2571. struct status_change *sc_data = ((struct map_session_data *)bl)->sc_data;
  2572. if(sc_data) {
  2573. if( sc_data[SC_FROSTWEAPON].timer!=-1) // フロストウェポン
  2574. ret=1;
  2575. if( sc_data[SC_SEISMICWEAPON].timer!=-1) // サイズミックウェポン
  2576. ret=2;
  2577. if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // フレームランチャー
  2578. ret=3;
  2579. if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ライトニングローダー
  2580. ret=4;
  2581. if( sc_data[SC_ENCPOISON].timer!=-1) // エンチャントポイズン
  2582. ret=5;
  2583. if( sc_data[SC_ASPERSIO].timer!=-1) // アスペルシオ
  2584. ret=6;
  2585. }
  2586. return ret;
  2587. }
  2588. return 0;
  2589. }
  2590. int status_get_party_id(struct block_list *bl)
  2591. {
  2592. nullpo_retr(0, bl);
  2593. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2594. return ((struct map_session_data *)bl)->status.party_id;
  2595. else if(bl->type==BL_MOB && (struct mob_data *)bl){
  2596. struct mob_data *md=(struct mob_data *)bl;
  2597. if( md->master_id>0 )
  2598. return -md->master_id;
  2599. return -md->bl.id;
  2600. }
  2601. else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
  2602. return ((struct skill_unit *)bl)->group->party_id;
  2603. else
  2604. return 0;
  2605. }
  2606. int status_get_guild_id(struct block_list *bl)
  2607. {
  2608. nullpo_retr(0, bl);
  2609. if(bl->type==BL_PC && (struct map_session_data *)bl)
  2610. return ((struct map_session_data *)bl)->status.guild_id;
  2611. else if(bl->type==BL_MOB && (struct mob_data *)bl)
  2612. return ((struct mob_data *)bl)->class_;
  2613. else if(bl->type==BL_SKILL && (struct skill_unit *)bl)
  2614. return ((struct skill_unit *)bl)->group->guild_id;
  2615. else
  2616. return 0;
  2617. }
  2618. int status_get_race(struct block_list *bl)
  2619. {
  2620. nullpo_retr(0, bl);
  2621. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2622. return mob_db[((struct mob_data *)bl)->class_].race;
  2623. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2624. return 7;
  2625. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2626. return mob_db[((struct pet_data *)bl)->class_].race;
  2627. else
  2628. return 0;
  2629. }
  2630. int status_get_size(struct block_list *bl)
  2631. {
  2632. nullpo_retr(1, bl);
  2633. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2634. return mob_db[((struct mob_data *)bl)->class_].size;
  2635. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2636. return mob_db[((struct pet_data *)bl)->class_].size;
  2637. else if(bl->type==BL_PC) {
  2638. struct map_session_data *sd = (struct map_session_data *)bl;
  2639. //if (pc_isriding(sd)) // fact or rumour?
  2640. // return 2;
  2641. if (pc_calc_upper(sd->status.class_) == 2)
  2642. return 0;
  2643. return 1;
  2644. } else
  2645. return 1;
  2646. }
  2647. int status_get_mode(struct block_list *bl)
  2648. {
  2649. nullpo_retr(0x01, bl);
  2650. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2651. return mob_db[((struct mob_data *)bl)->class_].mode;
  2652. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2653. return mob_db[((struct pet_data *)bl)->class_].mode;
  2654. else
  2655. return 0x01; // とりあえず動くということで1
  2656. }
  2657. int status_get_mexp(struct block_list *bl)
  2658. {
  2659. nullpo_retr(0, bl);
  2660. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2661. return mob_db[((struct mob_data *)bl)->class_].mexp;
  2662. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2663. return mob_db[((struct pet_data *)bl)->class_].mexp;
  2664. else
  2665. return 0;
  2666. }
  2667. int status_get_race2(struct block_list *bl)
  2668. {
  2669. nullpo_retr(0, bl);
  2670. if(bl->type == BL_MOB && (struct mob_data *)bl)
  2671. return mob_db[((struct mob_data *)bl)->class_].race2;
  2672. else if(bl->type==BL_PET && (struct pet_data *)bl)
  2673. return mob_db[((struct pet_data *)bl)->class_].race2;
  2674. else
  2675. return 0;
  2676. }
  2677. int status_isdead(struct block_list *bl)
  2678. {
  2679. nullpo_retr(0, bl);
  2680. if(bl->type == BL_MOB && (struct mob_data *)bl)
  2681. return ((struct mob_data *)bl)->state.state == MS_DEAD;
  2682. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2683. return pc_isdead((struct map_session_data *)bl);
  2684. else
  2685. return 0;
  2686. }
  2687. // StatusChange系の所得
  2688. struct status_change *status_get_sc_data(struct block_list *bl)
  2689. {
  2690. nullpo_retr(NULL, bl);
  2691. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2692. return ((struct mob_data*)bl)->sc_data;
  2693. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2694. return ((struct map_session_data*)bl)->sc_data;
  2695. return NULL;
  2696. }
  2697. short *status_get_sc_count(struct block_list *bl)
  2698. {
  2699. nullpo_retr(NULL, bl);
  2700. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2701. return &((struct mob_data*)bl)->sc_count;
  2702. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2703. return &((struct map_session_data*)bl)->sc_count;
  2704. return NULL;
  2705. }
  2706. short *status_get_opt1(struct block_list *bl)
  2707. {
  2708. nullpo_retr(0, bl);
  2709. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2710. return &((struct mob_data*)bl)->opt1;
  2711. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2712. return &((struct map_session_data*)bl)->opt1;
  2713. else if(bl->type==BL_NPC && (struct npc_data *)bl)
  2714. return &((struct npc_data*)bl)->opt1;
  2715. return 0;
  2716. }
  2717. short *status_get_opt2(struct block_list *bl)
  2718. {
  2719. nullpo_retr(0, bl);
  2720. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2721. return &((struct mob_data*)bl)->opt2;
  2722. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2723. return &((struct map_session_data*)bl)->opt2;
  2724. else if(bl->type==BL_NPC && (struct npc_data *)bl)
  2725. return &((struct npc_data*)bl)->opt2;
  2726. return 0;
  2727. }
  2728. short *status_get_opt3(struct block_list *bl)
  2729. {
  2730. nullpo_retr(0, bl);
  2731. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2732. return &((struct mob_data*)bl)->opt3;
  2733. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2734. return &((struct map_session_data*)bl)->opt3;
  2735. else if(bl->type==BL_NPC && (struct npc_data *)bl)
  2736. return &((struct npc_data*)bl)->opt3;
  2737. return 0;
  2738. }
  2739. short *status_get_option(struct block_list *bl)
  2740. {
  2741. nullpo_retr(0, bl);
  2742. if(bl->type==BL_MOB && (struct mob_data *)bl)
  2743. return &((struct mob_data*)bl)->option;
  2744. else if(bl->type==BL_PC && (struct map_session_data *)bl)
  2745. return &((struct map_session_data*)bl)->status.option;
  2746. else if(bl->type==BL_NPC && (struct npc_data *)bl)
  2747. return &((struct npc_data*)bl)->option;
  2748. return 0;
  2749. }
  2750. int status_get_sc_def(struct block_list *bl, int type)
  2751. {
  2752. int sc_def;
  2753. nullpo_retr(0, bl);
  2754. switch (type)
  2755. {
  2756. case SP_MDEF1: // mdef
  2757. sc_def = 100 - (3 + status_get_mdef(bl) + status_get_luk(bl)/3);
  2758. break;
  2759. case SP_MDEF2: // int
  2760. sc_def = 100 - (3 + status_get_int(bl) + status_get_luk(bl)/3);
  2761. break;
  2762. case SP_DEF1: // def
  2763. sc_def = 100 - (3 + status_get_def(bl) + status_get_luk(bl)/3);
  2764. break;
  2765. case SP_DEF2: // vit
  2766. sc_def = 100 - (3 + status_get_vit(bl) + status_get_luk(bl)/3);
  2767. break;
  2768. case SP_LUK: // luck
  2769. sc_def = 100 - (3 + status_get_luk(bl));
  2770. break;
  2771. case SC_STONE:
  2772. case SC_FREEZE:
  2773. sc_def = 100 - (3 + status_get_mdef(bl) + status_get_luk(bl)/3);
  2774. break;
  2775. case SC_STAN:
  2776. case SC_POISON:
  2777. case SC_SILENCE:
  2778. sc_def = 100 - (3 + status_get_vit(bl) + status_get_luk(bl)/3);
  2779. break;
  2780. case SC_SLEEP:
  2781. case SC_CONFUSION:
  2782. case SC_BLIND:
  2783. sc_def = 100 - (3 + status_get_int(bl) + status_get_luk(bl)/3);
  2784. break;
  2785. case SC_CURSE:
  2786. sc_def = 100 - (3 + status_get_luk(bl));
  2787. break;
  2788. default:
  2789. sc_def = 100;
  2790. break;
  2791. }
  2792. if(bl->type == BL_MOB && sc_def < 50)
  2793. sc_def = 50;
  2794. else if(bl->type == BL_PC) {
  2795. struct status_change* sc_data = status_get_sc_data(bl);
  2796. if (sc_data && sc_data[SC_GOSPEL].timer != -1 &&
  2797. sc_data[SC_GOSPEL].val4 == BCT_PARTY &&
  2798. sc_data[SC_GOSPEL].val3 == 3)
  2799. sc_def -= 25;
  2800. }
  2801. return (sc_def < 0) ? 0 : sc_def;
  2802. }
  2803. /*==========================================
  2804. * ステータス異常開始
  2805. *------------------------------------------
  2806. */
  2807. int status_change_start(struct block_list *bl,int type,int val1,int val2,int val3,int val4,int tick,int flag)
  2808. {
  2809. struct map_session_data *sd = NULL;
  2810. struct status_change* sc_data;
  2811. short *sc_count, *option, *opt1, *opt2, *opt3;
  2812. int opt_flag = 0, calc_flag = 0,updateflag = 0, save_flag = 0, race, mode, elem, undead_flag;
  2813. int scdef=0;
  2814. nullpo_retr(0, bl);
  2815. if(bl->type == BL_SKILL)
  2816. return 0;
  2817. if(bl->type == BL_MOB)
  2818. if (status_isdead(bl)) return 0;
  2819. nullpo_retr(0, sc_data=status_get_sc_data(bl));
  2820. nullpo_retr(0, sc_count=status_get_sc_count(bl));
  2821. nullpo_retr(0, option=status_get_option(bl));
  2822. nullpo_retr(0, opt1=status_get_opt1(bl));
  2823. nullpo_retr(0, opt2=status_get_opt2(bl));
  2824. nullpo_retr(0, opt3=status_get_opt3(bl));
  2825. race=status_get_race(bl);
  2826. mode=status_get_mode(bl);
  2827. elem=status_get_elem_type(bl);
  2828. undead_flag=battle_check_undead(race,elem);
  2829. if(type == SC_AETERNA && (sc_data[SC_STONE].timer != -1 || sc_data[SC_FREEZE].timer != -1) )
  2830. return 0;
  2831. switch(type){
  2832. case SC_STONE:
  2833. case SC_FREEZE:
  2834. scdef=3+status_get_mdef(bl)+status_get_luk(bl)/3;
  2835. break;
  2836. case SC_STAN:
  2837. case SC_SILENCE:
  2838. case SC_POISON:
  2839. case SC_DPOISON:
  2840. scdef=3+status_get_vit(bl)+status_get_luk(bl)/3;
  2841. break;
  2842. case SC_SLEEP:
  2843. case SC_BLIND:
  2844. scdef=3+status_get_int(bl)+status_get_luk(bl)/3;
  2845. break;
  2846. case SC_CURSE:
  2847. scdef=3+status_get_luk(bl);
  2848. break;
  2849. // case SC_CONFUSION:
  2850. default:
  2851. scdef=0;
  2852. }
  2853. if(scdef>=100)
  2854. return 0;
  2855. if(bl->type==BL_PC){
  2856. sd=(struct map_session_data *)bl;
  2857. if( sd && type == SC_ADRENALINE && !(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)))
  2858. return 0;
  2859. if(SC_STONE<=type && type<=SC_BLIND){ /* カ?ドによる耐性 */
  2860. if( sd && sd->reseff[type-SC_STONE] > 0 && rand()%10000<sd->reseff[type-SC_STONE]){
  2861. if(battle_config.battle_log)
  2862. printf("PC %d skill_sc_start: cardによる異常耐性?動\n",sd->bl.id);
  2863. return 0;
  2864. }
  2865. }
  2866. }
  2867. else if(bl->type == BL_MOB) {
  2868. }
  2869. else {
  2870. if(battle_config.error_log)
  2871. printf("status_change_start: neither MOB nor PC !\n");
  2872. return 0;
  2873. }
  2874. if(type==SC_FREEZE && undead_flag && !(flag&1))
  2875. return 0;
  2876. if((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION || type == SC_OVERTHRUST) &&
  2877. sc_data[type].timer != -1 && sc_data[type].val2 && !val2)
  2878. return 0;
  2879. if(mode & 0x20 && (type==SC_STONE || type==SC_FREEZE ||
  2880. type==SC_STAN || type==SC_SLEEP || type==SC_SILENCE || type==SC_QUAGMIRE || type == SC_DECREASEAGI || type == SC_SIGNUMCRUCIS || type == SC_PROVOKE ||
  2881. (type == SC_BLESSING && (undead_flag || race == 6))) && !(flag&1)){
  2882. /* ボスには?かない(ただしカ?ドによる?果は適用される) */
  2883. return 0;
  2884. }
  2885. if(type==SC_FREEZE || type==SC_STAN || type==SC_SLEEP)
  2886. battle_stopwalking(bl,1);
  2887. if(sc_data[type].timer != -1){ /* すでに同じ異常になっている場合タイマ解除 */
  2888. if(sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION &&
  2889. type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2 && type != SC_SPEEDPOTION3
  2890. && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris]
  2891. return 0;
  2892. if ((type >=SC_STAN && type <= SC_BLIND) || type == SC_DPOISON)
  2893. return 0;/* ?ぎ足しができない?態異常である時は?態異常を行わない */
  2894. (*sc_count)--;
  2895. delete_timer(sc_data[type].timer, status_change_timer);
  2896. sc_data[type].timer = -1;
  2897. }
  2898. switch(type){ /* 異常の種類ごとの?理 */
  2899. case SC_PROVOKE: /* プロボック */
  2900. calc_flag = 1;
  2901. if(tick <= 0) tick = 1000; /* (オ?トバ?サ?ク) */
  2902. break;
  2903. case SC_ENDURE: /* インデュア */
  2904. if(tick <= 0) tick = 1000 * 60;
  2905. calc_flag = 1; // for updating mdef
  2906. val2 = 7; // [Celest]
  2907. break;
  2908. case SC_AUTOBERSERK:
  2909. {
  2910. tick = 60*1000;
  2911. if (bl->type == BL_PC && sd->status.hp<sd->status.max_hp>>2 &&
  2912. (sc_data[SC_PROVOKE].timer==-1 || sc_data[SC_PROVOKE].val2==0))
  2913. status_change_start(bl,SC_PROVOKE,10,1,0,0,0,0);
  2914. }
  2915. break;
  2916. case SC_CONCENTRATE: /* 集中力向上 */
  2917. calc_flag = 1;
  2918. break;
  2919. case SC_BLESSING: /* ブレッシング */
  2920. {
  2921. if(bl->type == BL_PC || (!undead_flag && race != 6)) {
  2922. if(sc_data[SC_CURSE].timer!=-1 )
  2923. status_change_end(bl,SC_CURSE,-1);
  2924. if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2 == 0)
  2925. status_change_end(bl,SC_STONE,-1);
  2926. }
  2927. calc_flag = 1;
  2928. }
  2929. break;
  2930. case SC_ANGELUS: /* アンゼルス */
  2931. calc_flag = 1;
  2932. break;
  2933. case SC_INCREASEAGI: /* 速度上昇 */
  2934. calc_flag = 1;
  2935. if(sc_data[SC_DECREASEAGI].timer!=-1 )
  2936. status_change_end(bl,SC_DECREASEAGI,-1);
  2937. // the effect will still remain [celest]
  2938. // if(sc_data[SC_WINDWALK].timer!=-1 ) /* ウインドウォ?ク */
  2939. // status_change_end(bl,SC_WINDWALK,-1);
  2940. break;
  2941. case SC_DECREASEAGI: /* 速度減少 */
  2942. if (bl->type == BL_PC) // Celest
  2943. tick>>=1;
  2944. calc_flag = 1;
  2945. if(sc_data[SC_INCREASEAGI].timer!=-1 )
  2946. status_change_end(bl,SC_INCREASEAGI,-1);
  2947. if(sc_data[SC_ADRENALINE].timer!=-1 )
  2948. status_change_end(bl,SC_ADRENALINE,-1);
  2949. if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
  2950. status_change_end(bl,SC_SPEARSQUICKEN,-1);
  2951. if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
  2952. status_change_end(bl,SC_TWOHANDQUICKEN,-1);
  2953. break;
  2954. case SC_SIGNUMCRUCIS: /* シグナムクルシス */
  2955. calc_flag = 1;
  2956. // val2 = 14 + val1;
  2957. val2 = 10 + val1*2;
  2958. tick = 600*1000;
  2959. clif_emotion(bl,4);
  2960. break;
  2961. case SC_SLOWPOISON:
  2962. if (sc_data[SC_POISON].timer == -1 && sc_data[SC_DPOISON].timer == -1)
  2963. return 0;
  2964. break;
  2965. case SC_TWOHANDQUICKEN: /* 2HQ */
  2966. if(sc_data[SC_DECREASEAGI].timer!=-1)
  2967. return 0;
  2968. *opt3 |= 1;
  2969. calc_flag = 1;
  2970. break;
  2971. case SC_ADRENALINE: /* アドレナリンラッシュ */
  2972. if(sc_data[SC_DECREASEAGI].timer!=-1)
  2973. return 0;
  2974. calc_flag = 1;
  2975. break;
  2976. case SC_WEAPONPERFECTION: /* ウェポンパ?フェクション */
  2977. // Lasting time penalties have been removed on sakray as of 12/14 [celest]
  2978. //if(battle_config.party_skill_penalty && !val2) tick /= 5;
  2979. break;
  2980. case SC_OVERTHRUST: /* オ?バ?スラスト */
  2981. *opt3 |= 2;
  2982. // Lasting time penalties have been removed on sakray as of 12/14 [celest]
  2983. //if(battle_config.party_skill_penalty && !val2) tick /= 10;
  2984. break;
  2985. case SC_MAXIMIZEPOWER: /* マキシマイズパワ?(SPが1減る時間,val2にも) */
  2986. if(bl->type == BL_PC)
  2987. val2 = tick;
  2988. else
  2989. tick = 5000*val1;
  2990. break;
  2991. case SC_ENCPOISON: /* エンチャントポイズン */
  2992. calc_flag = 1;
  2993. val2=(((val1 - 1) / 2) + 3)*100; /* 毒付?確率 */
  2994. skill_encchant_eremental_end(bl,SC_ENCPOISON);
  2995. break;
  2996. case SC_EDP: // [Celest]
  2997. val2 = val1 + 2; /* 猛毒付?確率(%) */
  2998. calc_flag = 1;
  2999. break;
  3000. case SC_POISONREACT: /* ポイズンリアクト */
  3001. val2=val1/2 + val1%2; // [Celest]
  3002. break;
  3003. case SC_IMPOSITIO: /* インポシティオマヌス */
  3004. calc_flag = 1;
  3005. break;
  3006. case SC_ASPERSIO: /* アスペルシオ */
  3007. skill_encchant_eremental_end(bl,SC_ASPERSIO);
  3008. break;
  3009. case SC_SUFFRAGIUM: /* サフラギム */
  3010. case SC_BENEDICTIO: /* 聖? */
  3011. case SC_MAGNIFICAT: /* マグニフィカ?ト */
  3012. case SC_AETERNA: /* エ?テルナ */
  3013. break;
  3014. case SC_ENERGYCOAT: /* エナジ?コ?ト */
  3015. *opt3 |= 4;
  3016. break;
  3017. case SC_MAGICROD:
  3018. val2 = val1*20;
  3019. break;
  3020. case SC_KYRIE: /* キリエエレイソン */
  3021. val2 = status_get_max_hp(bl) * (val1 * 2 + 10) / 100;/* 耐久度 */
  3022. val3 = (val1 / 2 + 5); /* 回? */
  3023. // -- moonsoul (added to undo assumptio status if target has it)
  3024. if(sc_data[SC_ASSUMPTIO].timer!=-1 )
  3025. status_change_end(bl,SC_ASSUMPTIO,-1);
  3026. break;
  3027. case SC_MINDBREAKER:
  3028. calc_flag = 1;
  3029. if(tick <= 0) tick = 1000; /* (オ?トバ?サ?ク) */
  3030. case SC_GLORIA: /* グロリア */
  3031. calc_flag = 1;
  3032. break;
  3033. case SC_LOUD: /* ラウドボイス */
  3034. calc_flag = 1;
  3035. break;
  3036. case SC_TRICKDEAD: /* 死んだふり */
  3037. if (bl->type == BL_PC) {
  3038. pc_stopattack((struct map_session_data *)sd);
  3039. }
  3040. break;
  3041. case SC_QUAGMIRE: /* クァグマイア */
  3042. calc_flag = 1;
  3043. if(sc_data[SC_CONCENTRATE].timer!=-1 ) /* 集中力向上解除 */
  3044. status_change_end(bl,SC_CONCENTRATE,-1);
  3045. if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */
  3046. status_change_end(bl,SC_INCREASEAGI,-1);
  3047. if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
  3048. status_change_end(bl,SC_TWOHANDQUICKEN,-1);
  3049. if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
  3050. status_change_end(bl,SC_SPEARSQUICKEN,-1);
  3051. if(sc_data[SC_ADRENALINE].timer!=-1 )
  3052. status_change_end(bl,SC_ADRENALINE,-1);
  3053. if(sc_data[SC_LOUD].timer!=-1 )
  3054. status_change_end(bl,SC_LOUD,-1);
  3055. if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* トゥル?サイト */
  3056. status_change_end(bl,SC_TRUESIGHT,-1);
  3057. if(sc_data[SC_WINDWALK].timer!=-1 ) /* ウインドウォ?ク */
  3058. status_change_end(bl,SC_WINDWALK,-1);
  3059. if(sc_data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */
  3060. status_change_end(bl,SC_CARTBOOST,-1);
  3061. break;
  3062. case SC_MAGICPOWER:
  3063. calc_flag = 1;
  3064. val2 = 1;
  3065. break;
  3066. case SC_SACRIFICE:
  3067. val2 = 5;
  3068. break;
  3069. case SC_FLAMELAUNCHER: /* フレ?ムランチャ? */
  3070. skill_encchant_eremental_end(bl,SC_FLAMELAUNCHER);
  3071. break;
  3072. case SC_FROSTWEAPON: /* フロストウェポン */
  3073. skill_encchant_eremental_end(bl,SC_FROSTWEAPON);
  3074. break;
  3075. case SC_LIGHTNINGLOADER: /* ライトニングロ?ダ? */
  3076. skill_encchant_eremental_end(bl,SC_LIGHTNINGLOADER);
  3077. break;
  3078. case SC_SEISMICWEAPON: /* サイズミックウェポン */
  3079. skill_encchant_eremental_end(bl,SC_SEISMICWEAPON);
  3080. break;
  3081. case SC_DEVOTION: /* ディボ?ション */
  3082. calc_flag = 1;
  3083. break;
  3084. case SC_PROVIDENCE: /* プロヴィデンス */
  3085. calc_flag = 1;
  3086. val2=val1*5;
  3087. break;
  3088. case SC_REFLECTSHIELD:
  3089. val2=10+val1*3;
  3090. break;
  3091. case SC_STRIPWEAPON:
  3092. if (val2==0) val2=90;
  3093. break;
  3094. case SC_STRIPSHIELD:
  3095. if (val2==0) val2=85;
  3096. break;
  3097. case SC_STRIPARMOR:
  3098. case SC_STRIPHELM:
  3099. case SC_CP_WEAPON:
  3100. case SC_CP_SHIELD:
  3101. case SC_CP_ARMOR:
  3102. case SC_CP_HELM:
  3103. break;
  3104. case SC_AUTOSPELL: /* オ?トスペル */
  3105. val4 = 5 + val1*2;
  3106. break;
  3107. case SC_VOLCANO:
  3108. calc_flag = 1;
  3109. val3 = val1*10;
  3110. val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
  3111. break;
  3112. case SC_DELUGE:
  3113. calc_flag = 1;
  3114. val3 = val1>=5?15: (val1==4?14: (val1==3?12: ( val1==2?9:5 ) ) );
  3115. val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
  3116. break;
  3117. case SC_VIOLENTGALE:
  3118. calc_flag = 1;
  3119. val3 = val1*3;
  3120. val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) );
  3121. break;
  3122. case SC_SPEARSQUICKEN: /* スピアクイッケン */
  3123. calc_flag = 1;
  3124. val2 = 20+val1;
  3125. *opt3 |= 1;
  3126. break;
  3127. case SC_COMBO:
  3128. break;
  3129. case SC_BLADESTOP_WAIT: /* 白刃取り(待ち) */
  3130. break;
  3131. case SC_BLADESTOP: /* 白刃取り */
  3132. if(val2==2) clif_bladestop((struct block_list *)val3,(struct block_list *)val4,1);
  3133. *opt3 |= 32;
  3134. break;
  3135. case SC_LULLABY: /* 子守唄 */
  3136. val2 = 11;
  3137. break;
  3138. case SC_RICHMANKIM:
  3139. break;
  3140. case SC_ETERNALCHAOS: /* エタ?ナルカオス */
  3141. calc_flag = 1;
  3142. break;
  3143. case SC_DRUMBATTLE: /* ?太鼓の響き */
  3144. calc_flag = 1;
  3145. val2 = (val1+1)*25;
  3146. val3 = (val1+1)*2;
  3147. break;
  3148. case SC_NIBELUNGEN: /* ニ?ベルングの指輪 */
  3149. calc_flag = 1;
  3150. //val2 = (val1+2)*50;
  3151. val3 = (val1+2)*25;
  3152. break;
  3153. case SC_ROKISWEIL: /* ロキの叫び */
  3154. break;
  3155. case SC_INTOABYSS: /* 深淵の中に */
  3156. break;
  3157. case SC_SIEGFRIED: /* 不死身のジ?クフリ?ド */
  3158. calc_flag = 1;
  3159. val2 = 55 + val1*5;
  3160. val3 = val1*10;
  3161. break;
  3162. case SC_DISSONANCE: /* 不協和音 */
  3163. val2 = 10;
  3164. break;
  3165. case SC_WHISTLE: /* 口笛 */
  3166. calc_flag = 1;
  3167. break;
  3168. case SC_ASSNCROS: /* 夕陽のアサシンクロス */
  3169. calc_flag = 1;
  3170. break;
  3171. case SC_POEMBRAGI: /* ブラギの詩 */
  3172. break;
  3173. case SC_APPLEIDUN: /* イドゥンの林檎 */
  3174. calc_flag = 1;
  3175. break;
  3176. case SC_UGLYDANCE: /* 自分勝手なダンス */
  3177. val2 = 10;
  3178. break;
  3179. case SC_HUMMING: /* ハミング */
  3180. calc_flag = 1;
  3181. break;
  3182. case SC_DONTFORGETME: /* 私を忘れないで */
  3183. calc_flag = 1;
  3184. if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */
  3185. status_change_end(bl,SC_INCREASEAGI,-1);
  3186. if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 )
  3187. status_change_end(bl,SC_TWOHANDQUICKEN,-1);
  3188. if(sc_data[SC_SPEARSQUICKEN].timer!=-1 )
  3189. status_change_end(bl,SC_SPEARSQUICKEN,-1);
  3190. if(sc_data[SC_ADRENALINE].timer!=-1 )
  3191. status_change_end(bl,SC_ADRENALINE,-1);
  3192. if(sc_data[SC_ASSNCROS].timer!=-1 )
  3193. status_change_end(bl,SC_ASSNCROS,-1);
  3194. if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* トゥル?サイト */
  3195. status_change_end(bl,SC_TRUESIGHT,-1);
  3196. if(sc_data[SC_WINDWALK].timer!=-1 ) /* ウインドウォ?ク */
  3197. status_change_end(bl,SC_WINDWALK,-1);
  3198. if(sc_data[SC_CARTBOOST].timer!=-1 ) /* カ?トブ?スト */
  3199. status_change_end(bl,SC_CARTBOOST,-1);
  3200. break;
  3201. case SC_FORTUNE: /* 幸運のキス */
  3202. calc_flag = 1;
  3203. break;
  3204. case SC_SERVICE4U: /* サ?ビスフォ?ユ? */
  3205. calc_flag = 1;
  3206. break;
  3207. case SC_MOONLIT:
  3208. val2 = bl->id;
  3209. break;
  3210. case SC_DANCING: /* ダンス/演奏中 */
  3211. calc_flag = 1;
  3212. val3= tick / 1000;
  3213. tick = 1000;
  3214. break;
  3215. case SC_EXPLOSIONSPIRITS: // 爆裂波動
  3216. calc_flag = 1;
  3217. val2 = 75 + 25*val1;
  3218. *opt3 |= 8;
  3219. break;
  3220. case SC_STEELBODY: // 金剛
  3221. calc_flag = 1;
  3222. *opt3 |= 16;
  3223. break;
  3224. case SC_EXTREMITYFIST: /* 阿修羅覇凰拳 */
  3225. break;
  3226. case SC_AUTOCOUNTER:
  3227. val3 = val4 = 0;
  3228. break;
  3229. case SC_SPEEDPOTION0: /* ?速ポ?ション */
  3230. case SC_SPEEDPOTION1:
  3231. case SC_SPEEDPOTION2:
  3232. case SC_SPEEDPOTION3:
  3233. calc_flag = 1;
  3234. tick = 1000 * tick;
  3235. val2 = 5*(2+type-SC_SPEEDPOTION0);
  3236. break;
  3237. /* atk & matk potions [Valaris] */
  3238. case SC_ATKPOT:
  3239. case SC_MATKPOT:
  3240. calc_flag = 1;
  3241. tick = 1000 * tick;
  3242. break;
  3243. case SC_WEDDING: //結婚用(結婚衣裳になって?くのが?いとか)
  3244. {
  3245. time_t timer;
  3246. calc_flag = 1;
  3247. tick = 10000;
  3248. if(!val2)
  3249. val2 = time(&timer);
  3250. }
  3251. break;
  3252. case SC_NOCHAT: //チャット禁止?態
  3253. {
  3254. time_t timer;
  3255. if(!battle_config.muting_players)
  3256. break;
  3257. tick = 60000;
  3258. if(!val2)
  3259. val2 = time(&timer);
  3260. updateflag = SP_MANNER;
  3261. save_flag = 1; // celest
  3262. }
  3263. break;
  3264. case SC_SELFDESTRUCTION: //自爆
  3265. clif_skillcasting(bl,bl->id, bl->id,0,0,331,skill_get_time(val2,val1));
  3266. val3 = tick / 1000;
  3267. tick = 1000;
  3268. break;
  3269. /* option1 */
  3270. case SC_STONE: /* 石化 */
  3271. if(!(flag&2)) {
  3272. int sc_def = status_get_mdef(bl)*200;
  3273. tick = tick - sc_def;
  3274. }
  3275. val3 = tick/1000;
  3276. if(val3 < 1) val3 = 1;
  3277. tick = 5000;
  3278. val2 = 1;
  3279. break;
  3280. case SC_SLEEP: /* 睡眠 */
  3281. if(!(flag&2)) {
  3282. // int sc_def = 100 - (status_get_int(bl) + status_get_luk(bl)/3);
  3283. // tick = tick * sc_def / 100;
  3284. // if(tick < 1000) tick = 1000;
  3285. tick = 30000;//睡眠はステ?タス耐性に?わらず30秒
  3286. }
  3287. break;
  3288. case SC_FREEZE: /* 凍結 */
  3289. if(!(flag&2)) {
  3290. int sc_def = 100 - status_get_mdef(bl);
  3291. tick = tick * sc_def / 100;
  3292. }
  3293. break;
  3294. case SC_STAN: /* スタン(val2にミリ秒セット) */
  3295. if(!(flag&2)) {
  3296. int sc_def = status_get_sc_def_vit(bl);
  3297. tick = tick * sc_def / 100;
  3298. }
  3299. break;
  3300. /* option2 */
  3301. case SC_DPOISON: /* 猛毒 */
  3302. {
  3303. int mhp = status_get_max_hp(bl);
  3304. int hp = status_get_hp(bl);
  3305. // MHP?1/4????????
  3306. if (hp > mhp>>2) {
  3307. if(bl->type == BL_PC) {
  3308. int diff = mhp*10/100;
  3309. if (hp - diff < mhp>>2)
  3310. hp = hp - (mhp>>2);
  3311. pc_heal((struct map_session_data *)bl, -hp, 0);
  3312. } else if(bl->type == BL_MOB) {
  3313. struct mob_data *md = (struct mob_data *)bl;
  3314. hp -= mhp*15/100;
  3315. if (hp > mhp>>2)
  3316. md->hp = hp;
  3317. else
  3318. md->hp = mhp>>2;
  3319. }
  3320. }
  3321. } // fall through
  3322. case SC_POISON: /* 毒 */
  3323. calc_flag = 1;
  3324. if(!(flag&2)) {
  3325. int sc_def = 100 - (status_get_vit(bl) + status_get_luk(bl)/5);
  3326. tick = tick * sc_def / 100;
  3327. }
  3328. val3 = tick/1000;
  3329. if(val3 < 1) val3 = 1;
  3330. tick = 1000;
  3331. break;
  3332. case SC_SILENCE: /* 沈?(レックスデビ?ナ) */
  3333. if(!(flag&2)) {
  3334. int sc_def = 100 - status_get_vit(bl);
  3335. tick = tick * sc_def / 100;
  3336. }
  3337. break;
  3338. case SC_CONFUSION:
  3339. val2 = tick;
  3340. tick = 100;
  3341. clif_emotion(bl,1);
  3342. if (sd) {
  3343. pc_stop_walking (sd, 0);
  3344. }
  3345. break;
  3346. case SC_BLIND: /* 暗? */
  3347. calc_flag = 1;
  3348. if(!(flag&2)) {
  3349. int sc_def = status_get_lv(bl)/10 + status_get_int(bl)/15;
  3350. tick = 30000 - sc_def;
  3351. }
  3352. break;
  3353. case SC_CURSE:
  3354. calc_flag = 1;
  3355. if(!(flag&2)) {
  3356. int sc_def = 100 - status_get_vit(bl);
  3357. tick = tick * sc_def / 100;
  3358. }
  3359. break;
  3360. /* option */
  3361. case SC_HIDING: /* ハイディング */
  3362. calc_flag = 1;
  3363. if(bl->type == BL_PC) {
  3364. val2 = tick / 1000; /* 持?時間 */
  3365. tick = 1000;
  3366. }
  3367. break;
  3368. case SC_CHASEWALK:
  3369. case SC_CLOAKING: /* クロ?キング */
  3370. if(bl->type == BL_PC) {
  3371. calc_flag = 1; // [Celest]
  3372. val2 = tick;
  3373. val3 = type==SC_CLOAKING ? 130-val1*3 : 135-val1*5;
  3374. }
  3375. else
  3376. tick = 5000*val1;
  3377. break;
  3378. case SC_SIGHT: /* サイト/ルアフ */
  3379. case SC_RUWACH:
  3380. val2 = tick/250;
  3381. tick = 10;
  3382. break;
  3383. /* セ?フティウォ?ル、ニュ?マ */
  3384. case SC_SAFETYWALL: case SC_PNEUMA:
  3385. tick=((struct skill_unit *)val2)->group->limit;
  3386. break;
  3387. /* アンクル */
  3388. case SC_ANKLE:
  3389. break;
  3390. /* ウォ?タ?ボ?ル */
  3391. case SC_WATERBALL:
  3392. tick=150;
  3393. if(val1>5) //レベルが5以上の場合は25?に制限(1?目はすでに打ってるので-1)
  3394. val3=5*5-1;
  3395. else
  3396. val3= (val1|1)*(val1|1)-1;
  3397. break;
  3398. /* スキルじゃない/時間に?係しない */
  3399. case SC_RIDING:
  3400. calc_flag = 1;
  3401. tick = 600*1000;
  3402. break;
  3403. case SC_FALCON:
  3404. case SC_WEIGHT50:
  3405. case SC_WEIGHT90:
  3406. case SC_BROKNWEAPON:
  3407. case SC_BROKNARMOR:
  3408. tick=600*1000;
  3409. break;
  3410. case SC_AUTOGUARD:
  3411. {
  3412. int i,t;
  3413. for(i=val2=0;i<val1;i++) {
  3414. t = 5-(i>>1);
  3415. val2 += (t < 0)? 1:t;
  3416. }
  3417. }
  3418. break;
  3419. case SC_DEFENDER:
  3420. calc_flag = 1;
  3421. val2 = 5 + val1*15;
  3422. break;
  3423. case SC_KEEPING:
  3424. case SC_BARRIER:
  3425. calc_flag = 1;
  3426. case SC_HALLUCINATION:
  3427. break;
  3428. case SC_CONCENTRATION: /* コンセントレ?ション */
  3429. *opt3 |= 1;
  3430. calc_flag = 1;
  3431. break;
  3432. case SC_TENSIONRELAX: /* テンションリラックス */
  3433. calc_flag = 1;
  3434. if(bl->type == BL_PC) {
  3435. tick = 10000;
  3436. }
  3437. break;
  3438. case SC_AURABLADE: /* オ?ラブレ?ド */
  3439. case SC_PARRYING: /* パリイング */
  3440. // case SC_ASSUMPTIO: /* */
  3441. // case SC_HEADCRUSH: /* ヘッドクラッシュ */
  3442. // case SC_JOINTBEAT: /* ジョイントビ?ト */
  3443. // case SC_MARIONETTE: /* マリオネットコントロ?ル */
  3444. //とりあえず手?き
  3445. break;
  3446. // -- moonsoul (for new upper class related skill status effects)
  3447. /*
  3448. case SC_AURABLADE:
  3449. val2 = val1*10;
  3450. break;
  3451. case SC_PARRYING:
  3452. val2=val1*3;
  3453. break;
  3454. case SC_CONCENTRATION:
  3455. calc_flag=1;
  3456. val2=val1*10;
  3457. val3=val1*5;
  3458. break;
  3459. case SC_TENSIONRELAX:
  3460. // val2 = 10;
  3461. // val3 = 15;
  3462. break;
  3463. case SC_BERSERK:
  3464. calc_flag=1;
  3465. break;
  3466. case SC_ASSUMPTIO:
  3467. if(sc_data[SC_KYRIE].timer!=-1 )
  3468. status_change_end(bl,SC_KYRIE,-1);
  3469. break;*/
  3470. case SC_WINDWALK: /* ウインドウォ?ク */
  3471. calc_flag = 1;
  3472. val2 = (val1 / 2); //Flee上昇率
  3473. break;
  3474. case SC_JOINTBEAT: // Random break [DracoRPG]
  3475. calc_flag = 1;
  3476. val2 = rand()%6 + 1;
  3477. if (val2 == 6) status_change_start(bl,SC_BLEEDING,val1,0,0,0,skill_get_time2(type,val1),0);
  3478. break;
  3479. case SC_BERSERK: /* バ?サ?ク */
  3480. if(sd){
  3481. sd->status.hp = sd->status.max_hp * 3;
  3482. sd->status.sp = 0;
  3483. clif_updatestatus(sd,SP_HP);
  3484. clif_updatestatus(sd,SP_SP);
  3485. clif_status_change(bl,SC_INCREASEAGI,1); /* アイコン表示 */
  3486. sd->canregen_tick = gettick() + 300000;
  3487. }
  3488. *opt3 |= 128;
  3489. tick = 10000;
  3490. calc_flag = 1;
  3491. break;
  3492. case SC_ASSUMPTIO: /* アスムプティオ */
  3493. if(sc_data[SC_KYRIE].timer!=-1 )
  3494. status_change_end(bl,SC_KYRIE,-1);
  3495. break;
  3496. *opt3 |= 2048;
  3497. break;
  3498. case SC_BASILICA: // [celest]
  3499. break;
  3500. case SC_GOSPEL:
  3501. if (val4 == BCT_SELF) { // self effect
  3502. int i;
  3503. if (sd) {
  3504. sd->canact_tick += tick;
  3505. sd->canmove_tick += tick;
  3506. }
  3507. val2 = tick;
  3508. tick = 1000;
  3509. for (i=0; i<=26; i++) {
  3510. if(sc_data[i].timer!=-1)
  3511. status_change_end(bl,i,-1);
  3512. }
  3513. for (i=58; i<=62; i++) {
  3514. if(sc_data[i].timer!=-1)
  3515. status_change_end(bl,i,-1);
  3516. }
  3517. for (i=132; i<=136; i++) {
  3518. if(sc_data[i].timer!=-1)
  3519. status_change_end(bl,i,-1);
  3520. }
  3521. }
  3522. break;
  3523. case SC_MARIONETTE: /* マリオネットコントロ?ル */
  3524. case SC_MARIONETTE2:
  3525. val2 = tick;
  3526. if (!val3)
  3527. return 0;
  3528. tick = 1000;
  3529. calc_flag = 1;
  3530. *opt3 |= 1024;
  3531. break;
  3532. case SC_MELTDOWN: /* メルトダウン */
  3533. case SC_CARTBOOST: /* カ?トブ?スト */
  3534. case SC_TRUESIGHT: /* トゥル?サイト */
  3535. case SC_SPIDERWEB: /* スパイダ?ウェッブ */
  3536. calc_flag = 1;
  3537. break;
  3538. case SC_REJECTSWORD: /* リジェクトソ?ド */
  3539. val2 = 3; //3回攻?を跳ね返す
  3540. break;
  3541. case SC_MEMORIZE: /* メモライズ */
  3542. val2 = 3; //3回詠唱を1/3にする
  3543. break;
  3544. case SC_SPLASHER: /* ベナムスプラッシャ? */
  3545. break;
  3546. case SC_FOGWALL:
  3547. val2 = 75;
  3548. // calc_flag = 1; // not sure of effects yet [celest]
  3549. break;
  3550. case SC_PRESERVE:
  3551. break;
  3552. case SC_BLEEDING:
  3553. {
  3554. // every 1 vit deducts 1 second
  3555. val3 = tick - status_get_vit(bl) * 1000;
  3556. // minimum 50 seconds
  3557. if (val3 < 50000)
  3558. val3 = 50000;
  3559. val4 = 10000;
  3560. tick = 1000;
  3561. }
  3562. break;
  3563. case SC_SLOWDOWN:
  3564. case SC_SPEEDUP0:
  3565. calc_flag = 1;
  3566. break;
  3567. case SC_REGENERATION:
  3568. val1 = 2;
  3569. case SC_BATTLEORDERS:
  3570. tick = 60000; // 1 minute
  3571. calc_flag = 1;
  3572. break;
  3573. default:
  3574. if(battle_config.error_log)
  3575. printf("UnknownStatusChange [%d]\n", type);
  3576. return 0;
  3577. }
  3578. if(bl->type==BL_PC &&
  3579. (type<SC_SENDMAX || type==SC_PRESERVE || type==SC_BATTLEORDERS))
  3580. clif_status_change(bl,type,1); /* アイコン表示 */
  3581. /* optionの?更 */
  3582. switch(type){
  3583. case SC_STONE:
  3584. case SC_FREEZE:
  3585. case SC_STAN:
  3586. case SC_SLEEP:
  3587. battle_stopattack(bl); /* 攻?停止 */
  3588. skill_stop_dancing(bl,0); /* 演奏/ダンスの中? */
  3589. { /* 同時に掛からないステ?タス異常を解除 */
  3590. int i;
  3591. for(i = SC_STONE; i <= SC_SLEEP; i++){
  3592. if(sc_data[i].timer != -1){
  3593. (*sc_count)--;
  3594. delete_timer(sc_data[i].timer, status_change_timer);
  3595. sc_data[i].timer = -1;
  3596. }
  3597. }
  3598. }
  3599. if(type == SC_STONE)
  3600. *opt1 = 6;
  3601. else
  3602. *opt1 = type - SC_STONE + 1;
  3603. opt_flag = 1;
  3604. break;
  3605. case SC_POISON:
  3606. case SC_CURSE:
  3607. case SC_SILENCE:
  3608. case SC_BLIND:
  3609. *opt2 |= 1<<(type-SC_POISON);
  3610. opt_flag = 1;
  3611. break;
  3612. case SC_DPOISON: // 暫定で毒のエフェクトを使用
  3613. *opt2 |= 1;
  3614. opt_flag = 1;
  3615. break;
  3616. case SC_SIGNUMCRUCIS:
  3617. *opt2 |= 0x40;
  3618. opt_flag = 1;
  3619. break;
  3620. case SC_HIDING:
  3621. case SC_CLOAKING:
  3622. battle_stopattack(bl); /* 攻?停止 */
  3623. *option |= ((type==SC_HIDING)?2:4);
  3624. opt_flag =1 ;
  3625. break;
  3626. case SC_CHASEWALK:
  3627. battle_stopattack(bl); /* 攻?停止 */
  3628. *option |= 16388;
  3629. opt_flag =1 ;
  3630. break;
  3631. case SC_SIGHT:
  3632. *option |= 1;
  3633. opt_flag = 1;
  3634. break;
  3635. case SC_RUWACH:
  3636. *option |= 8192;
  3637. opt_flag = 1;
  3638. break;
  3639. case SC_WEDDING:
  3640. *option |= 4096;
  3641. opt_flag = 1;
  3642. }
  3643. if(opt_flag) /* optionの?更 */
  3644. clif_changeoption(bl);
  3645. (*sc_count)++; /* ステ?タス異常の? */
  3646. sc_data[type].val1 = val1;
  3647. sc_data[type].val2 = val2;
  3648. sc_data[type].val3 = val3;
  3649. sc_data[type].val4 = val4;
  3650. /* タイマ?設定 */
  3651. sc_data[type].timer = add_timer(
  3652. gettick() + tick, status_change_timer, bl->id, type);
  3653. if(bl->type==BL_PC && calc_flag)
  3654. status_calc_pc(sd,0); /* ステ?タス再計算 */
  3655. if(bl->type==BL_PC && save_flag)
  3656. chrif_save(sd); // save the player status
  3657. if(bl->type==BL_PC && updateflag)
  3658. clif_updatestatus(sd,updateflag); /* ステ?タスをクライアントに送る */
  3659. return 0;
  3660. }
  3661. /*==========================================
  3662. * ステータス異常全解除
  3663. *------------------------------------------
  3664. */
  3665. int status_change_clear(struct block_list *bl,int type)
  3666. {
  3667. struct status_change* sc_data;
  3668. short *sc_count, *option, *opt1, *opt2, *opt3;
  3669. int i;
  3670. nullpo_retr(0, bl);
  3671. nullpo_retr(0, sc_data = status_get_sc_data(bl));
  3672. nullpo_retr(0, sc_count = status_get_sc_count(bl));
  3673. nullpo_retr(0, option = status_get_option(bl));
  3674. nullpo_retr(0, opt1 = status_get_opt1(bl));
  3675. nullpo_retr(0, opt2 = status_get_opt2(bl));
  3676. nullpo_retr(0, opt3 = status_get_opt3(bl));
  3677. if (*sc_count == 0)
  3678. return 0;
  3679. for(i = 0; i < MAX_STATUSCHANGE; i++){
  3680. if(sc_data[i].timer != -1){ /* 異常があるならタイマ?を削除する */
  3681. status_change_end(bl, i, -1);
  3682. }
  3683. }
  3684. *sc_count = 0;
  3685. *opt1 = 0;
  3686. *opt2 = 0;
  3687. *opt3 = 0;
  3688. *option &= OPTION_MASK;
  3689. if (night_flag == 1 && type == BL_PC && !map[bl->m].flag.indoors && // by [Yor]
  3690. !map[bl->m].flag.indoors && battle_config.night_darkness_level <= 0) // [celest]
  3691. *opt2 |= STATE_BLIND;
  3692. if(!type || type&2)
  3693. clif_changeoption(bl);
  3694. return 0;
  3695. }
  3696. /*==========================================
  3697. * ステータス異常終了
  3698. *------------------------------------------
  3699. */
  3700. int status_change_end( struct block_list* bl , int type,int tid )
  3701. {
  3702. struct status_change* sc_data;
  3703. int opt_flag=0, calc_flag = 0;
  3704. short *sc_count, *option, *opt1, *opt2, *opt3;
  3705. nullpo_retr(0, bl);
  3706. if(bl->type!=BL_PC && bl->type!=BL_MOB) {
  3707. if(battle_config.error_log)
  3708. printf("status_change_end: neither MOB nor PC !\n");
  3709. return 0;
  3710. }
  3711. nullpo_retr(0, sc_data = status_get_sc_data(bl));
  3712. nullpo_retr(0, sc_count = status_get_sc_count(bl));
  3713. nullpo_retr(0, option = status_get_option(bl));
  3714. nullpo_retr(0, opt1 = status_get_opt1(bl));
  3715. nullpo_retr(0, opt2 = status_get_opt2(bl));
  3716. nullpo_retr(0, opt3 = status_get_opt3(bl));
  3717. if ((*sc_count) > 0 && sc_data[type].timer != -1 && (sc_data[type].timer == tid || tid == -1)) {
  3718. if (tid == -1) // タイマから呼ばれていないならタイマ削除をする
  3719. delete_timer(sc_data[type].timer,status_change_timer);
  3720. /* 該?の異常を正常に?す */
  3721. sc_data[type].timer=-1;
  3722. (*sc_count)--;
  3723. switch(type){ /* 異常の種類ごとの?理 */
  3724. case SC_PROVOKE: /* プロボック */
  3725. case SC_ENDURE: // celest
  3726. case SC_CONCENTRATE: /* 集中力向上 */
  3727. case SC_BLESSING: /* ブレッシング */
  3728. case SC_ANGELUS: /* アンゼルス */
  3729. case SC_INCREASEAGI: /* 速度上昇 */
  3730. case SC_DECREASEAGI: /* 速度減少 */
  3731. case SC_SIGNUMCRUCIS: /* シグナムクルシス */
  3732. case SC_HIDING:
  3733. case SC_TWOHANDQUICKEN: /* 2HQ */
  3734. case SC_ADRENALINE: /* アドレナリンラッシュ */
  3735. case SC_ENCPOISON: /* エンチャントポイズン */
  3736. case SC_IMPOSITIO: /* インポシティオマヌス */
  3737. case SC_GLORIA: /* グロリア */
  3738. case SC_LOUD: /* ラウドボイス */
  3739. case SC_QUAGMIRE: /* クァグマイア */
  3740. case SC_PROVIDENCE: /* プロヴィデンス */
  3741. case SC_SPEARSQUICKEN: /* スピアクイッケン */
  3742. case SC_VOLCANO:
  3743. case SC_DELUGE:
  3744. case SC_VIOLENTGALE:
  3745. case SC_ETERNALCHAOS: /* エタ?ナルカオス */
  3746. case SC_DRUMBATTLE: /* ?太鼓の響き */
  3747. case SC_NIBELUNGEN: /* ニ?ベルングの指輪 */
  3748. case SC_SIEGFRIED: /* 不死身のジ?クフリ?ド */
  3749. case SC_WHISTLE: /* 口笛 */
  3750. case SC_ASSNCROS: /* 夕陽のアサシンクロス */
  3751. case SC_HUMMING: /* ハミング */
  3752. case SC_DONTFORGETME: /* 私を忘れないで */
  3753. case SC_FORTUNE: /* 幸運のキス */
  3754. case SC_SERVICE4U: /* サ?ビスフォ?ユ? */
  3755. case SC_EXPLOSIONSPIRITS: // 爆裂波動
  3756. case SC_STEELBODY: // 金剛
  3757. case SC_DEFENDER:
  3758. case SC_SPEEDPOTION0: /* ?速ポ?ション */
  3759. case SC_SPEEDPOTION1:
  3760. case SC_SPEEDPOTION2:
  3761. case SC_SPEEDPOTION3:
  3762. case SC_APPLEIDUN: /* イドゥンの林檎 */
  3763. case SC_RIDING:
  3764. case SC_BLADESTOP_WAIT:
  3765. case SC_AURABLADE: /* オ?ラブレ?ド */
  3766. case SC_PARRYING: /* パリイング */
  3767. case SC_CONCENTRATION: /* コンセントレ?ション */
  3768. case SC_TENSIONRELAX: /* テンションリラックス */
  3769. case SC_ASSUMPTIO: /* アシャンプティオ */
  3770. case SC_WINDWALK: /* ウインドウォ?ク */
  3771. case SC_TRUESIGHT: /* トゥル?サイト */
  3772. case SC_SPIDERWEB: /* スパイダ?ウェッブ */
  3773. case SC_MAGICPOWER: /* 魔法力?幅 */
  3774. case SC_CHASEWALK:
  3775. case SC_ATKPOT: /* attack potion [Valaris] */
  3776. case SC_MATKPOT: /* magic attack potion [Valaris] */
  3777. case SC_WEDDING: //結婚用(結婚衣裳になって?くのが?いとか)
  3778. case SC_MELTDOWN: /* メルトダウン */
  3779. // Celest
  3780. case SC_EDP:
  3781. case SC_SLOWDOWN:
  3782. case SC_SPEEDUP0:
  3783. /* case SC_LEADERSHIP:
  3784. case SC_GLORYWOUNDS:
  3785. case SC_SOULCOLD:
  3786. case SC_HAWKEYES:*/
  3787. case SC_BATTLEORDERS:
  3788. case SC_REGENERATION:
  3789. calc_flag = 1;
  3790. break;
  3791. case SC_AUTOBERSERK:
  3792. if (sc_data[SC_PROVOKE].timer != -1)
  3793. status_change_end(bl,SC_PROVOKE,-1);
  3794. break;
  3795. case SC_BERSERK: /* バ?サ?ク */
  3796. calc_flag = 1;
  3797. clif_status_change(bl,SC_INCREASEAGI,0); /* アイコン消去 */
  3798. break;
  3799. case SC_DEVOTION: /* ディボ?ション */
  3800. {
  3801. struct map_session_data *md = map_id2sd(sc_data[type].val1);
  3802. sc_data[type].val1=sc_data[type].val2=0;
  3803. skill_devotion(md,bl->id);
  3804. calc_flag = 1;
  3805. }
  3806. break;
  3807. case SC_BLADESTOP:
  3808. {
  3809. struct status_change *t_sc_data = status_get_sc_data((struct block_list *)sc_data[type].val4);
  3810. //片方が切れたので相手の白刃?態が切れてないのなら解除
  3811. if(t_sc_data && t_sc_data[SC_BLADESTOP].timer!=-1)
  3812. status_change_end((struct block_list *)sc_data[type].val4,SC_BLADESTOP,-1);
  3813. if(sc_data[type].val2==2)
  3814. clif_bladestop((struct block_list *)sc_data[type].val3,(struct block_list *)sc_data[type].val4,0);
  3815. }
  3816. break;
  3817. case SC_DANCING:
  3818. {
  3819. struct map_session_data *dsd;
  3820. struct status_change *d_sc_data;
  3821. if(sc_data[type].val4 && (dsd=map_id2sd(sc_data[type].val4))){
  3822. d_sc_data = dsd->sc_data;
  3823. //合奏で相手がいる場合相手のval4を0にする
  3824. if(d_sc_data && d_sc_data[type].timer!=-1)
  3825. d_sc_data[type].val4=0;
  3826. }
  3827. }
  3828. calc_flag = 1;
  3829. break;
  3830. case SC_NOCHAT: //チャット禁止?態
  3831. {
  3832. struct map_session_data *sd=NULL;
  3833. if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
  3834. if (sd->status.manner >= 0) // weeee ^^ [celest]
  3835. sd->status.manner = 0;
  3836. clif_updatestatus(sd,SP_MANNER);
  3837. }
  3838. }
  3839. break;
  3840. case SC_SPLASHER: /* ベナムスプラッシャ? */
  3841. {
  3842. struct block_list *src=map_id2bl(sc_data[type].val3);
  3843. if(src && tid!=-1){
  3844. //自分にダメ?ジ&周?3*3にダメ?ジ
  3845. skill_castend_damage_id(src, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
  3846. }
  3847. }
  3848. break;
  3849. case SC_SELFDESTRUCTION: /* 自爆 */
  3850. {
  3851. //自分のダメ?ジは0にして
  3852. struct mob_data *md=NULL;
  3853. if(bl->type == BL_MOB && (md=(struct mob_data*)bl))
  3854. skill_castend_damage_id(bl, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 );
  3855. }
  3856. break;
  3857. /* option1 */
  3858. case SC_FREEZE:
  3859. sc_data[type].val3 = 0;
  3860. break;
  3861. /* option2 */
  3862. case SC_POISON: /* 毒 */
  3863. case SC_BLIND: /* 暗? */
  3864. case SC_CURSE:
  3865. calc_flag = 1;
  3866. break;
  3867. // celest
  3868. case SC_CONFUSION:
  3869. {
  3870. struct map_session_data *sd=NULL;
  3871. if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){
  3872. sd->next_walktime = -1;
  3873. }
  3874. }
  3875. break;
  3876. case SC_MARIONETTE: /* マリオネットコントロ?ル */
  3877. case SC_MARIONETTE2: /// Marionette target
  3878. {
  3879. // check for partner and end their marionette status as well
  3880. int type2 = (type == SC_MARIONETTE) ? SC_MARIONETTE2 : SC_MARIONETTE;
  3881. struct block_list *pbl = map_id2bl(sc_data[type].val3);
  3882. if (pbl) {
  3883. struct status_change* sc_data;
  3884. if (*status_get_sc_count(pbl) > 0 &&
  3885. (sc_data = status_get_sc_data(pbl)) &&
  3886. sc_data[type2].timer != -1)
  3887. status_change_end(pbl, type2, -1);
  3888. }
  3889. calc_flag = 1;
  3890. }
  3891. break;
  3892. }
  3893. if(bl->type==BL_PC &&
  3894. (type<SC_SENDMAX || type==SC_PRESERVE || type==SC_BATTLEORDERS))
  3895. clif_status_change(bl,type,0); /* アイコン消去 */
  3896. switch(type){ /* 正常に?るときなにか?理が必要 */
  3897. case SC_STONE:
  3898. case SC_FREEZE:
  3899. case SC_STAN:
  3900. case SC_SLEEP:
  3901. *opt1 = 0;
  3902. opt_flag = 1;
  3903. break;
  3904. case SC_POISON:
  3905. if (sc_data[SC_DPOISON].timer != -1) //
  3906. break; // DPOISON用のオプション
  3907. *opt2 &= ~1; // が?用に用意された場合には
  3908. opt_flag = 1; // ここは削除する
  3909. break; //
  3910. case SC_CURSE:
  3911. case SC_SILENCE:
  3912. case SC_BLIND:
  3913. *opt2 &= ~(1<<(type-SC_POISON));
  3914. opt_flag = 1;
  3915. break;
  3916. case SC_DPOISON:
  3917. if (sc_data[SC_POISON].timer != -1) // DPOISON用のオプションが
  3918. break; // 用意されたら削除
  3919. *opt2 &= ~1; // 毒?態解除
  3920. opt_flag = 1;
  3921. break;
  3922. case SC_SIGNUMCRUCIS:
  3923. *opt2 &= ~0x40;
  3924. opt_flag = 1;
  3925. break;
  3926. case SC_HIDING:
  3927. case SC_CLOAKING:
  3928. *option &= ~((type == SC_HIDING) ? 2 : 4);
  3929. calc_flag = 1; // orn
  3930. opt_flag = 1 ;
  3931. break;
  3932. case SC_CHASEWALK:
  3933. *option &= ~16388;
  3934. opt_flag = 1 ;
  3935. break;
  3936. case SC_SIGHT:
  3937. *option &= ~1;
  3938. opt_flag = 1;
  3939. break;
  3940. case SC_WEDDING: //結婚用(結婚衣裳になって?くのが?いとか)
  3941. *option &= ~4096;
  3942. opt_flag = 1;
  3943. break;
  3944. case SC_RUWACH:
  3945. *option &= ~8192;
  3946. opt_flag = 1;
  3947. break;
  3948. //opt3
  3949. case SC_TWOHANDQUICKEN: /* 2HQ */
  3950. case SC_SPEARSQUICKEN: /* スピアクイッケン */
  3951. case SC_CONCENTRATION: /* コンセントレ?ション */
  3952. *opt3 &= ~1;
  3953. break;
  3954. case SC_OVERTHRUST: /* オ?バ?スラスト */
  3955. *opt3 &= ~2;
  3956. break;
  3957. case SC_ENERGYCOAT: /* エナジ?コ?ト */
  3958. *opt3 &= ~4;
  3959. break;
  3960. case SC_EXPLOSIONSPIRITS: // 爆裂波動
  3961. *opt3 &= ~8;
  3962. break;
  3963. case SC_STEELBODY: // 金剛
  3964. *opt3 &= ~16;
  3965. break;
  3966. case SC_BLADESTOP: /* 白刃取り */
  3967. *opt3 &= ~32;
  3968. break;
  3969. case SC_BERSERK: /* バ?サ?ク */
  3970. *opt3 &= ~128;
  3971. break;
  3972. case SC_MARIONETTE: /* マリオネットコントロ?ル */
  3973. case SC_MARIONETTE2:
  3974. *opt3 &= ~1024;
  3975. break;
  3976. case SC_ASSUMPTIO: /* アスムプティオ */
  3977. *opt3 &= ~2048;
  3978. break;
  3979. }
  3980. if (night_flag == 1 && (*opt2 & STATE_BLIND) == 0 && bl->type == BL_PC && // by [Yor]
  3981. !map[bl->m].flag.indoors && battle_config.night_darkness_level <= 0) { // [celest]
  3982. *opt2 |= STATE_BLIND;
  3983. opt_flag = 1;
  3984. }
  3985. if(opt_flag) /* optionの?更を?える */
  3986. clif_changeoption(bl);
  3987. if (bl->type == BL_PC && calc_flag)
  3988. status_calc_pc((struct map_session_data *)bl,0); /* ステ?タス再計算 */
  3989. }
  3990. return 0;
  3991. }
  3992. /*==========================================
  3993. * ステータス異常終了タイマー
  3994. *------------------------------------------
  3995. */
  3996. int status_change_timer(int tid, unsigned int tick, int id, int data)
  3997. {
  3998. int type = data;
  3999. struct block_list *bl;
  4000. struct map_session_data *sd=NULL;
  4001. struct status_change *sc_data;
  4002. //short *sc_count; //使ってない?
  4003. nullpo_retr_f(0, bl=map_id2bl(id), "id=%d data=%d",id,data);
  4004. nullpo_retr(0, sc_data=status_get_sc_data(bl));
  4005. if(bl->type==BL_PC)
  4006. nullpo_retr(0, sd=(struct map_session_data *)bl);
  4007. //sc_count=status_get_sc_count(bl); //使ってない?
  4008. if(sc_data[type].timer != tid) {
  4009. if(battle_config.error_log)
  4010. printf("status_change_timer %d != %d\n",tid,sc_data[type].timer);
  4011. return 0;
  4012. }
  4013. switch(type){ /* 特殊な?理になる場合 */
  4014. case SC_MAXIMIZEPOWER: /* マキシマイズパワ? */
  4015. case SC_CLOAKING:
  4016. if(sd){
  4017. if( sd->status.sp > 0 ){ /* SP切れるまで持? */
  4018. sd->status.sp--;
  4019. clif_updatestatus(sd,SP_SP);
  4020. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4021. sc_data[type].val2+tick, status_change_timer, bl->id, data);
  4022. return 0;
  4023. }
  4024. }
  4025. break;
  4026. case SC_CHASEWALK:
  4027. if(sd){
  4028. int sp = 10+sc_data[SC_CHASEWALK].val1*2;
  4029. if (map[sd->bl.m].flag.gvg) sp *= 5;
  4030. if( sd->status.sp > sp){
  4031. sd->status.sp -= sp; // update sp cost [Celest]
  4032. clif_updatestatus(sd,SP_SP);
  4033. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4034. sc_data[type].val2+tick, status_change_timer, bl->id, data);
  4035. sc_data[SC_CHASEWALK].val4++;
  4036. if (sc_data[SC_CHASEWALK].val4 > 3)
  4037. sc_data[SC_CHASEWALK].val4 = 0;
  4038. status_calc_pc (sd, 0);
  4039. return 0;
  4040. }
  4041. }
  4042. break;
  4043. case SC_HIDING: /* ハイディング */
  4044. if(sd){ /* SPがあって、時間制限の間は持? */
  4045. if( sd->status.sp > 0 && (--sc_data[type].val2)>0 ){
  4046. if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
  4047. sd->status.sp--;
  4048. clif_updatestatus(sd,SP_SP);
  4049. }
  4050. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4051. 1000+tick, status_change_timer,
  4052. bl->id, data);
  4053. return 0;
  4054. }
  4055. }
  4056. break;
  4057. case SC_SIGHT: /* サイト */
  4058. case SC_RUWACH: /* ルアフ */
  4059. {
  4060. int range = 5;
  4061. if ( type == SC_SIGHT ) range = 7;
  4062. map_foreachinarea( status_change_timer_sub,
  4063. bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0,
  4064. bl,type,tick);
  4065. if( (--sc_data[type].val2)>0 ){
  4066. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4067. 250+tick, status_change_timer,
  4068. bl->id, data);
  4069. return 0;
  4070. }
  4071. }
  4072. break;
  4073. case SC_SIGNUMCRUCIS: /* シグナムクルシス */
  4074. {
  4075. int race = status_get_race(bl);
  4076. if(race == 6 || battle_check_undead(race,status_get_elem_type(bl))) {
  4077. sc_data[type].timer=add_timer(1000*600+tick,status_change_timer, bl->id, data );
  4078. return 0;
  4079. }
  4080. }
  4081. break;
  4082. case SC_PROVOKE: /* プロボック/オ?トバ?サ?ク */
  4083. if(sc_data[type].val2!=0){ /* オ?トバ?サ?ク(1秒ごとにHPチェック) */
  4084. if(sd && sd->status.hp>sd->status.max_hp>>2) /* 停止 */
  4085. break;
  4086. sc_data[type].timer=add_timer( 1000+tick,status_change_timer, bl->id, data );
  4087. return 0;
  4088. }
  4089. break;
  4090. case SC_WATERBALL: /* ウォ?タ?ボ?ル */
  4091. {
  4092. struct block_list *target=map_id2bl(sc_data[type].val2);
  4093. if (!target || !target->prev)
  4094. break; // target has been killed in previous hits, no need to raise an alarm ^^;
  4095. // nullpo_retb(target);
  4096. // nullpo_retb(target->prev);
  4097. skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0);
  4098. if((--sc_data[type].val3)>0) {
  4099. sc_data[type].timer=add_timer( 150+tick,status_change_timer, bl->id, data );
  4100. return 0;
  4101. }
  4102. }
  4103. break;
  4104. case SC_ENDURE: /* インデュア */
  4105. case SC_AUTOBERSERK: // Celest
  4106. if(sd && sd->special_state.infinite_endure) {
  4107. #ifdef TWILIGHT
  4108. sc_data[type].timer=add_timer( 1000*600+tick,status_change_timer, bl->id, data );
  4109. #else
  4110. sc_data[type].timer=add_timer( 1000*60+tick,status_change_timer, bl->id, data );
  4111. #endif
  4112. //sc_data[type].val2=1;
  4113. return 0;
  4114. }
  4115. break;
  4116. case SC_DISSONANCE: /* 不協和音 */
  4117. if( (--sc_data[type].val2)>0){
  4118. struct skill_unit *unit=
  4119. (struct skill_unit *)sc_data[type].val4;
  4120. struct block_list *src;
  4121. /*if(!unit || !unit->group)
  4122. break;
  4123. src=map_id2bl(unit->group->src_id);
  4124. if(!src)
  4125. break;*/
  4126. nullpo_retb(unit);
  4127. nullpo_retb(unit->group);
  4128. nullpo_retb(src=map_id2bl(unit->group->src_id));
  4129. skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0);
  4130. if( (bl->type==BL_MOB) && (MS_DEAD==((struct mob_data *)bl)->state.state) )
  4131. break;
  4132. sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick,
  4133. status_change_timer, bl->id, data );
  4134. return 0;
  4135. }
  4136. break;
  4137. case SC_LULLABY: /* 子守唄 */
  4138. if( (--sc_data[type].val2)>0){
  4139. struct skill_unit *unit=
  4140. (struct skill_unit *)sc_data[type].val4;
  4141. nullpo_retb(unit);
  4142. nullpo_retb(unit->group);
  4143. if(unit->group->src_id == bl->id)
  4144. break;
  4145. skill_additional_effect(bl,bl,unit->group->skill_id,sc_data[type].val1,BF_LONG|BF_SKILL|BF_MISC,tick);
  4146. if (unit->group != 0)
  4147. sc_data[type].timer=add_timer(skill_get_time(unit->group->skill_id,unit->group->skill_lv)/10+tick,
  4148. status_change_timer, bl->id, data );
  4149. return 0;
  4150. }
  4151. break;
  4152. case SC_STONE:
  4153. if(sc_data[type].val2 != 0) {
  4154. short *opt1 = status_get_opt1(bl);
  4155. sc_data[type].val2 = 0;
  4156. sc_data[type].val4 = 0;
  4157. battle_stopwalking(bl,1);
  4158. if(opt1) {
  4159. *opt1 = 1;
  4160. clif_changeoption(bl);
  4161. }
  4162. sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
  4163. return 0;
  4164. }
  4165. else if( (--sc_data[type].val3) > 0) {
  4166. int hp = status_get_max_hp(bl);
  4167. if((++sc_data[type].val4)%5 == 0 && status_get_hp(bl) > hp>>2) {
  4168. hp = hp/100;
  4169. if(hp < 1) hp = 1;
  4170. if(sd)
  4171. pc_heal(sd,-hp,0);
  4172. else if(bl->type == BL_MOB){
  4173. struct mob_data *md;
  4174. if((md=((struct mob_data *)bl)) == NULL)
  4175. break;
  4176. md->hp -= hp;
  4177. }
  4178. }
  4179. sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
  4180. return 0;
  4181. }
  4182. break;
  4183. case SC_POISON:
  4184. if(sc_data[SC_SLOWPOISON].timer == -1) {
  4185. if( (--sc_data[type].val3) > 0) {
  4186. int hp = status_get_max_hp(bl);
  4187. if(status_get_hp(bl) > hp>>2) {
  4188. if(sd) {
  4189. hp = 3 + hp*3/200;
  4190. pc_heal(sd,-hp,0);
  4191. }
  4192. else if(bl->type == BL_MOB) {
  4193. struct mob_data *md;
  4194. nullpo_retr(0, md=(struct mob_data *)bl);
  4195. /*if((md=((struct mob_data *)bl)) == NULL)
  4196. break;*/
  4197. hp = 3 + hp/200;
  4198. md->hp -= hp;
  4199. }
  4200. }
  4201. sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
  4202. }
  4203. }
  4204. else
  4205. sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
  4206. break;
  4207. case SC_DPOISON:
  4208. if (sc_data[SC_SLOWPOISON].timer == -1 && (--sc_data[type].val3) > 0) {
  4209. int hp = status_get_max_hp(bl);
  4210. if (status_get_hp(bl) > hp>>2) {
  4211. if(sd) {
  4212. hp = 3 + hp/50;
  4213. pc_heal(sd, -hp, 0);
  4214. } else if (bl->type == BL_MOB) {
  4215. struct mob_data *md;
  4216. nullpo_retr(0, md=(struct mob_data *)bl);
  4217. /*if ((md=((struct mob_data *)bl)) == NULL)
  4218. break;*/
  4219. hp = 3 + hp/100;
  4220. md->hp -= hp;
  4221. }
  4222. }
  4223. }
  4224. if (sc_data[type].val3 > 0)
  4225. sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
  4226. break;
  4227. case SC_TENSIONRELAX: /* テンションリラックス */
  4228. if(sd){ /* SPがあって、HPが?タンでなければ?? */
  4229. if( sd->status.sp > 12 && sd->status.max_hp > sd->status.hp ){
  4230. /* if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){
  4231. sd->status.sp -= 12;
  4232. clif_updatestatus(sd,SP_SP);
  4233. } */
  4234. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4235. 10000+tick, status_change_timer,
  4236. bl->id, data);
  4237. return 0;
  4238. }
  4239. if(sd->status.max_hp <= sd->status.hp)
  4240. status_change_end(&sd->bl,SC_TENSIONRELAX,-1);
  4241. }
  4242. break;
  4243. case SC_BLEEDING: // [celest]
  4244. // i hope i haven't interpreted it wrong.. which i might ^^;
  4245. // Source:
  4246. // - 10�ェエェネェヒHPェャハ�エ
  4247. // - �槢ェホェ゙ェ゙ォオ?ォミ�ヤムェ茘�戓ーェキェニェ�?ヘ�ェマ眈ェィェハェ、
  4248. if((sc_data[type].val3 -= 1000) > 0) {
  4249. if((sc_data[type].val4 -= 1000) > 0) {
  4250. int hp = rand()%300+400;
  4251. if(sd) {
  4252. pc_heal(sd,-hp,0);
  4253. sd->canmove_tick = tick+1000;
  4254. }
  4255. else if(bl->type == BL_MOB) {
  4256. struct mob_data *md;
  4257. nullpo_retr(0, md=(struct mob_data *)bl);
  4258. md->hp -= hp;
  4259. }
  4260. }
  4261. if (sd) {
  4262. sd->canact_tick = tick+1000;
  4263. }
  4264. sc_data[type].timer=add_timer(1000+tick,status_change_timer, bl->id, data );
  4265. }
  4266. break;
  4267. /* 時間切れ無し?? */
  4268. case SC_AETERNA:
  4269. case SC_TRICKDEAD:
  4270. case SC_RIDING:
  4271. case SC_FALCON:
  4272. case SC_WEIGHT50:
  4273. case SC_WEIGHT90:
  4274. case SC_MAGICPOWER: /* 魔法力?幅 */
  4275. case SC_REJECTSWORD: /* リジェクトソ?ド */
  4276. case SC_MEMORIZE: /* メモライズ */
  4277. case SC_BROKNWEAPON:
  4278. case SC_BROKNARMOR:
  4279. case SC_SACRIFICE:
  4280. // if(sc_data[type].timer==tid)
  4281. sc_data[type].timer=add_timer( 1000*600+tick,status_change_timer, bl->id, data );
  4282. return 0;
  4283. case SC_DANCING: //ダンススキルの時間SP消費
  4284. {
  4285. int s=0;
  4286. if(sd){
  4287. if(sd->status.sp > 0 && (--sc_data[type].val3)>0){
  4288. switch(sc_data[type].val1){
  4289. case BD_RICHMANKIM: /* ニヨルドの宴 3秒にSP1 */
  4290. case BD_DRUMBATTLEFIELD: /* ?太鼓の響き 3秒にSP1 */
  4291. case BD_RINGNIBELUNGEN: /* ニ?ベルングの指輪 3秒にSP1 */
  4292. case BD_SIEGFRIED: /* 不死身のジ?クフリ?ド 3秒にSP1 */
  4293. case BA_DISSONANCE: /* 不協和音 3秒でSP1 */
  4294. case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス 3秒でSP1 */
  4295. case DC_UGLYDANCE: /* 自分勝手なダンス 3秒でSP1 */
  4296. s=3;
  4297. break;
  4298. case BD_LULLABY: /* 子守歌 4秒にSP1 */
  4299. case BD_ETERNALCHAOS: /* 永遠の混沌 4秒にSP1 */
  4300. case BD_ROKISWEIL: /* ロキの叫び 4秒にSP1 */
  4301. case DC_FORTUNEKISS: /* 幸運のキス 4秒でSP1 */
  4302. s=4;
  4303. break;
  4304. case BD_INTOABYSS: /* 深淵の中に 5秒にSP1 */
  4305. case BA_WHISTLE: /* 口笛 5秒でSP1 */
  4306. case DC_HUMMING: /* ハミング 5秒でSP1 */
  4307. case BA_POEMBRAGI: /* ブラギの詩 5秒でSP1 */
  4308. case DC_SERVICEFORYOU: /* サ?ビスフォ?ユ? 5秒でSP1 */
  4309. s=5;
  4310. break;
  4311. case BA_APPLEIDUN: /* イドゥンの林檎 6秒でSP1 */
  4312. s=6;
  4313. break;
  4314. case DC_DONTFORGETME: /* 私を忘れないで… 10秒でSP1 */
  4315. case CG_MOONLIT: /* 月明りの泉に落ちる花びら 10秒でSP1? */
  4316. s=10;
  4317. break;
  4318. }
  4319. if(s && ((sc_data[type].val3 % s) == 0)){
  4320. sd->status.sp--;
  4321. clif_updatestatus(sd,SP_SP);
  4322. }
  4323. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4324. 1000+tick, status_change_timer,
  4325. bl->id, data);
  4326. return 0;
  4327. }
  4328. }
  4329. }
  4330. break;
  4331. case SC_BERSERK: /* バ?サ?ク */
  4332. if(sd){ /* HPが100以上なら?? */
  4333. if( (sd->status.hp - sd->status.max_hp*5/100) > 100 ){ // 5% every 10 seconds [DracoRPG]
  4334. sd->status.hp -= sd->status.max_hp*5/100; // changed to max hp [celest]
  4335. clif_updatestatus(sd,SP_HP);
  4336. sc_data[type].timer = add_timer( /* タイマ?再設定 */
  4337. 10000+tick, status_change_timer,
  4338. bl->id, data);
  4339. return 0;
  4340. }
  4341. }
  4342. break;
  4343. case SC_WEDDING: //結婚用(結婚衣裳になって?くのが?いとか)
  4344. if(sd){
  4345. time_t timer;
  4346. if(time(&timer) < ((sc_data[type].val2) + 3600)){ //1時間たっていないので??
  4347. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4348. 10000+tick, status_change_timer,
  4349. bl->id, data);
  4350. return 0;
  4351. }
  4352. }
  4353. break;
  4354. case SC_NOCHAT: //チャット禁止?態
  4355. if(sd && battle_config.muting_players){
  4356. time_t timer;
  4357. if((++sd->status.manner) && time(&timer) < ((sc_data[type].val2) + 60*(0-sd->status.manner))){ //開始からstatus.manner分?ってないので??
  4358. clif_updatestatus(sd,SP_MANNER);
  4359. sc_data[type].timer=add_timer( /* タイマ?再設定(60秒) */
  4360. 60000+tick, status_change_timer,
  4361. bl->id, data);
  4362. return 0;
  4363. }
  4364. }
  4365. break;
  4366. case SC_SELFDESTRUCTION: /* 自爆 */
  4367. if(--sc_data[type].val3>0){
  4368. struct mob_data *md;
  4369. if(bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->speed > 250){
  4370. md->speed -= 250;
  4371. md->next_walktime=tick;
  4372. }
  4373. sc_data[type].timer=add_timer( /* タイマ?再設定 */
  4374. 1000+tick, status_change_timer,
  4375. bl->id, data);
  4376. return 0;
  4377. }
  4378. break;
  4379. case SC_SPLASHER:
  4380. if (sc_data[type].val4 % 1000 == 0) {
  4381. char timer[2];
  4382. sprintf (timer, "%d", sc_data[type].val4/1000);
  4383. clif_message(bl, timer);
  4384. }
  4385. if((sc_data[type].val4 -= 500) > 0) {
  4386. sc_data[type].timer = add_timer(
  4387. 500 + tick, status_change_timer,
  4388. bl->id, data);
  4389. return 0;
  4390. }
  4391. break;
  4392. case SC_MARIONETTE: /* マリオネットコントロ?ル */
  4393. case SC_MARIONETTE2:
  4394. {
  4395. struct block_list *pbl = map_id2bl(sc_data[type].val3);
  4396. if (pbl && battle_check_range(bl, pbl, 7) &&
  4397. (sc_data[type].val2 -= 1000)>0) {
  4398. sc_data[type].timer = add_timer(
  4399. 1000 + tick, status_change_timer,
  4400. bl->id, data);
  4401. return 0;
  4402. }
  4403. }
  4404. break;
  4405. /* case SC_LEADERSHIP:
  4406. case SC_GLORYWOUNDS:
  4407. case SC_SOULCOLD:
  4408. case SC_HAWKEYES:
  4409. if (sd) {
  4410. sc_data[type].timer = add_timer(
  4411. 1000+tick, status_change_timer,
  4412. bl->id, data);
  4413. }
  4414. break;*/
  4415. // Celest
  4416. case SC_CONFUSION:
  4417. {
  4418. int i = 3000;
  4419. //struct mob_data *md;
  4420. if (sd) {
  4421. pc_randomwalk (sd, gettick());
  4422. sd->next_walktime = tick + (i=1000 + rand()%1000);
  4423. } /*else if (bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->mode&1 && mob_can_move(md)) {
  4424. md->state.state=MS_WALK;
  4425. if( DIFF_TICK(md->next_walktime,tick) > + 7000 &&
  4426. (md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len) )
  4427. md->next_walktime = tick + 3000*rand()%2000;
  4428. mob_randomwalk(md,tick);
  4429. }*/
  4430. if ((sc_data[type].val2 -= 1000) > 0) {
  4431. sc_data[type].timer = add_timer(
  4432. i + tick, status_change_timer,
  4433. bl->id, data);
  4434. return 0;
  4435. }
  4436. }
  4437. break;
  4438. case SC_GOSPEL:
  4439. {
  4440. int calc_flag = 0;
  4441. if (sc_data[type].val3 > 0) {
  4442. sc_data[type].val3 = 0;
  4443. calc_flag = 1;
  4444. }
  4445. if(sd && sc_data[type].val4 == BCT_SELF){
  4446. int hp, sp;
  4447. hp = (sc_data[type].val1 > 5) ? 45 : 30;
  4448. sp = (sc_data[type].val1 > 5) ? 35 : 20;
  4449. if(sd->status.hp - hp > 0 &&
  4450. sd->status.sp - sp > 0){
  4451. sd->status.hp -= hp;
  4452. sd->status.sp -= sp;
  4453. clif_updatestatus(sd,SP_HP);
  4454. clif_updatestatus(sd,SP_SP);
  4455. if ((sc_data[type].val2 -= 10000) > 0) {
  4456. sc_data[type].timer = add_timer(
  4457. 10000+tick, status_change_timer,
  4458. bl->id, data);
  4459. return 0;
  4460. }
  4461. }
  4462. } else if (sd && sc_data[type].val4 == BCT_PARTY) {
  4463. int i;
  4464. switch ((i = rand() % 12)) {
  4465. case 1: // heal between 100-1000
  4466. {
  4467. struct block_list tbl;
  4468. int heal = rand() % 900 + 100;
  4469. tbl.id = 0;
  4470. tbl.m = bl->m;
  4471. tbl.x = bl->x;
  4472. tbl.y = bl->y;
  4473. clif_skill_nodamage(&tbl,bl,AL_HEAL,heal,1);
  4474. battle_heal(NULL,bl,heal,0,0);
  4475. }
  4476. break;
  4477. case 2: // end negative status
  4478. {
  4479. int j;
  4480. for (j=0; j<4; j++)
  4481. if(sc_data[i + SC_POISON].timer!=-1) {
  4482. status_change_end(bl,j,-1);
  4483. break;
  4484. }
  4485. }
  4486. break;
  4487. case 3: // +25% resistance to negative status
  4488. case 4: // +25% max hp
  4489. case 5: // +25% max sp
  4490. case 6: // +2 to all stats
  4491. case 11: // +25% armor and vit def
  4492. case 12: // +8% atk
  4493. case 13: // +5% flee
  4494. case 14: // +5% hit
  4495. sc_data[type].val3 = i;
  4496. if (i == 6 ||
  4497. (i >= 11 && i <= 14))
  4498. calc_flag = 1;
  4499. break;
  4500. case 7: // level 5 bless
  4501. {
  4502. struct block_list tbl;
  4503. tbl.id = 0;
  4504. tbl.m = bl->m;
  4505. tbl.x = bl->x;
  4506. tbl.y = bl->y;
  4507. clif_skill_nodamage(&tbl,bl,AL_BLESSING,5,1);
  4508. status_change_start(bl,SkillStatusChangeTable[AL_BLESSING],5,0,0,0,10000,0 );
  4509. }
  4510. break;
  4511. case 8: // level 5 increase agility
  4512. {
  4513. struct block_list tbl;
  4514. tbl.id = 0;
  4515. tbl.m = bl->m;
  4516. tbl.x = bl->x;
  4517. tbl.y = bl->y;
  4518. clif_skill_nodamage(&tbl,bl,AL_INCAGI,5,1);
  4519. status_change_start(bl,SkillStatusChangeTable[AL_INCAGI],5,0,0,0,10000,0 );
  4520. }
  4521. break;
  4522. case 9: // holy element to weapon
  4523. {
  4524. struct block_list tbl;
  4525. tbl.id = 0;
  4526. tbl.m = bl->m;
  4527. tbl.x = bl->x;
  4528. tbl.y = bl->y;
  4529. clif_skill_nodamage(&tbl,bl,PR_ASPERSIO,1,1);
  4530. status_change_start(bl,SkillStatusChangeTable[PR_ASPERSIO],1,0,0,0,10000,0 );
  4531. }
  4532. break;
  4533. case 10: // holy element to armour
  4534. {
  4535. struct block_list tbl;
  4536. tbl.id = 0;
  4537. tbl.m = bl->m;
  4538. tbl.x = bl->x;
  4539. tbl.y = bl->y;
  4540. clif_skill_nodamage(&tbl,bl,PR_BENEDICTIO,1,1);
  4541. status_change_start(bl,SkillStatusChangeTable[PR_BENEDICTIO],1,0,0,0,10000,0 );
  4542. }
  4543. break;
  4544. default:
  4545. break;
  4546. }
  4547. } else if (sc_data[type].val4 == BCT_ENEMY) {
  4548. int i;
  4549. switch ((i = rand() % 8)) {
  4550. case 1: // damage between 300-800
  4551. case 2: // damage between 150-550 (ignore def)
  4552. battle_damage(NULL, bl, rand() % 500,0); // temporary damage
  4553. break;
  4554. case 3: // random status effect
  4555. {
  4556. int effect[3] = {
  4557. SC_CURSE,
  4558. SC_BLIND,
  4559. SC_POISON };
  4560. status_change_start(bl,effect[rand()%3],1,0,0,0,10000,0 );
  4561. }
  4562. break;
  4563. case 4: // level 10 provoke
  4564. {
  4565. struct block_list tbl;
  4566. tbl.id = 0;
  4567. tbl.m = bl->m;
  4568. tbl.x = bl->x;
  4569. tbl.y = bl->y;
  4570. clif_skill_nodamage(&tbl,bl,SM_PROVOKE,1,1);
  4571. status_change_start(bl,SkillStatusChangeTable[SM_PROVOKE],10,0,0,0,10000,0 );
  4572. }
  4573. break;
  4574. case 5: // 0 def
  4575. case 6: // 0 atk
  4576. case 7: // 0 flee
  4577. case 8: // -75% move speed and aspd
  4578. sc_data[type].val3 = i;
  4579. calc_flag = 1;
  4580. break;
  4581. default:
  4582. break;
  4583. }
  4584. }
  4585. if (sd && calc_flag)
  4586. status_calc_pc (sd, 0);
  4587. }
  4588. break;
  4589. }
  4590. return status_change_end( bl,type,tid );
  4591. }
  4592. /*==========================================
  4593. * ステータス異常タイマー範囲処理
  4594. *------------------------------------------
  4595. */
  4596. int status_change_timer_sub(struct block_list *bl, va_list ap )
  4597. {
  4598. struct block_list *src;
  4599. int type;
  4600. unsigned int tick;
  4601. nullpo_retr(0, bl);
  4602. nullpo_retr(0, ap);
  4603. nullpo_retr(0, src=va_arg(ap,struct block_list*));
  4604. type=va_arg(ap,int);
  4605. tick=va_arg(ap,unsigned int);
  4606. if(bl->type!=BL_PC && bl->type!=BL_MOB)
  4607. return 0;
  4608. switch( type ){
  4609. case SC_SIGHT: /* サイト */
  4610. case SC_CONCENTRATE:
  4611. if( (*status_get_option(bl))&6 ){
  4612. status_change_end( bl, SC_HIDING, -1);
  4613. status_change_end( bl, SC_CLOAKING, -1);
  4614. }
  4615. break;
  4616. case SC_RUWACH: /* ルアフ */
  4617. if( (*status_get_option(bl))&6 ){
  4618. struct status_change *sc_data = status_get_sc_data(bl); // check whether the target is hiding/cloaking [celest]
  4619. if (sc_data && (sc_data[SC_HIDING].timer != -1 || // if the target is using a special hiding, i.e not using normal hiding/cloaking, don't bother
  4620. sc_data[SC_CLOAKING].timer != -1)) {
  4621. status_change_end( bl, SC_HIDING, -1);
  4622. status_change_end( bl, SC_CLOAKING, -1);
  4623. }
  4624. if(battle_check_target( src,bl, BCT_ENEMY ) > 0)
  4625. skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0);
  4626. }
  4627. break;
  4628. }
  4629. return 0;
  4630. }
  4631. static int status_calc_sigma(void)
  4632. {
  4633. int i,j,k;
  4634. for(i=0;i<MAX_PC_CLASS;i++) {
  4635. memset(hp_sigma_val[i],0,sizeof(hp_sigma_val[i]));
  4636. for(k=0,j=2;j<=MAX_LEVEL;j++) {
  4637. k += hp_coefficient[i]*j + 50;
  4638. k -= k%100;
  4639. hp_sigma_val[i][j-1] = k;
  4640. }
  4641. }
  4642. return 0;
  4643. }
  4644. int status_readdb(void) {
  4645. int i,j,k;
  4646. FILE *fp;
  4647. char line[1024],*p;
  4648. // JOB補正?値1
  4649. fp=fopen("db/job_db1.txt","r");
  4650. if(fp==NULL){
  4651. printf("can't read db/job_db1.txt\n");
  4652. return 1;
  4653. }
  4654. i=0;
  4655. while(fgets(line, sizeof(line)-1, fp)){
  4656. char *split[50];
  4657. if(line[0]=='/' && line[1]=='/')
  4658. continue;
  4659. for(j=0,p=line;j<21 && p;j++){
  4660. split[j]=p;
  4661. p=strchr(p,',');
  4662. if(p) *p++=0;
  4663. }
  4664. if(j<21)
  4665. continue;
  4666. max_weight_base[i]=atoi(split[0]);
  4667. hp_coefficient[i]=atoi(split[1]);
  4668. hp_coefficient2[i]=atoi(split[2]);
  4669. sp_coefficient[i]=atoi(split[3]);
  4670. for(j=0;j<17;j++)
  4671. aspd_base[i][j]=atoi(split[j+4]);
  4672. i++;
  4673. // -- moonsoul (below two lines added to accommodate high numbered new class ids)
  4674. if(i==24)
  4675. i=4001;
  4676. if(i==MAX_PC_CLASS)
  4677. break;
  4678. }
  4679. fclose(fp);
  4680. sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/job_db1.txt");
  4681. ShowStatus(tmp_output);
  4682. // JOBボ?ナス
  4683. memset(job_bonus,0,sizeof(job_bonus));
  4684. fp=fopen("db/job_db2.txt","r");
  4685. if(fp==NULL){
  4686. printf("can't read db/job_db2.txt\n");
  4687. return 1;
  4688. }
  4689. i=0;
  4690. while(fgets(line, sizeof(line)-1, fp)){
  4691. if(line[0]=='/' && line[1]=='/')
  4692. continue;
  4693. for(j=0,p=line;j<MAX_LEVEL && p;j++){
  4694. if(sscanf(p,"%d",&k)==0)
  4695. break;
  4696. job_bonus[0][i][j]=k;
  4697. job_bonus[2][i][j]=k; //養子職のボ?ナスは分からないので?
  4698. p=strchr(p,',');
  4699. if(p) p++;
  4700. }
  4701. i++;
  4702. // -- moonsoul (below two lines added to accommodate high numbered new class ids)
  4703. if(i==24)
  4704. i=4001;
  4705. if(i==MAX_PC_CLASS)
  4706. break;
  4707. }
  4708. fclose(fp);
  4709. sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/job_db2.txt");
  4710. ShowStatus(tmp_output);
  4711. // JOBボ?ナス2 ?生職用
  4712. fp=fopen("db/job_db2-2.txt","r");
  4713. if(fp==NULL){
  4714. printf("can't read db/job_db2-2.txt\n");
  4715. return 1;
  4716. }
  4717. i=0;
  4718. while(fgets(line, sizeof(line)-1, fp)){
  4719. if(line[0]=='/' && line[1]=='/')
  4720. continue;
  4721. for(j=0,p=line;j<MAX_LEVEL && p;j++){
  4722. if(sscanf(p,"%d",&k)==0)
  4723. break;
  4724. job_bonus[1][i][j]=k;
  4725. p=strchr(p,',');
  4726. if(p) p++;
  4727. }
  4728. i++;
  4729. if(i==MAX_PC_CLASS)
  4730. break;
  4731. }
  4732. fclose(fp);
  4733. sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/job_db2-2.txt");
  4734. ShowStatus(tmp_output);
  4735. // サイズ補正テ?ブル
  4736. for(i=0;i<3;i++)
  4737. for(j=0;j<20;j++)
  4738. atkmods[i][j]=100;
  4739. fp=fopen("db/size_fix.txt","r");
  4740. if(fp==NULL){
  4741. printf("can't read db/size_fix.txt\n");
  4742. return 1;
  4743. }
  4744. i=0;
  4745. while(fgets(line, sizeof(line)-1, fp)){
  4746. char *split[20];
  4747. if(line[0]=='/' && line[1]=='/')
  4748. continue;
  4749. if(atoi(line)<=0)
  4750. continue;
  4751. memset(split,0,sizeof(split));
  4752. for(j=0,p=line;j<20 && p;j++){
  4753. split[j]=p;
  4754. p=strchr(p,',');
  4755. if(p) *p++=0;
  4756. }
  4757. for(j=0;j<20 && split[j];j++)
  4758. atkmods[i][j]=atoi(split[j]);
  4759. i++;
  4760. }
  4761. fclose(fp);
  4762. sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/size_fix.txt");
  4763. ShowStatus(tmp_output);
  4764. // 精?デ?タテ?ブル
  4765. for(i=0;i<5;i++){
  4766. for(j=0;j<10;j++)
  4767. percentrefinery[i][j]=100;
  4768. refinebonus[i][0]=0;
  4769. refinebonus[i][1]=0;
  4770. refinebonus[i][2]=10;
  4771. }
  4772. fp=fopen("db/refine_db.txt","r");
  4773. if(fp==NULL){
  4774. printf("can't read db/refine_db.txt\n");
  4775. return 1;
  4776. }
  4777. i=0;
  4778. while(fgets(line, sizeof(line)-1, fp)){
  4779. char *split[16];
  4780. if(line[0]=='/' && line[1]=='/')
  4781. continue;
  4782. if(atoi(line)<=0)
  4783. continue;
  4784. memset(split,0,sizeof(split));
  4785. for(j=0,p=line;j<16 && p;j++){
  4786. split[j]=p;
  4787. p=strchr(p,',');
  4788. if(p) *p++=0;
  4789. }
  4790. refinebonus[i][0]=atoi(split[0]); // 精?ボ?ナス
  4791. refinebonus[i][1]=atoi(split[1]); // 過?精?ボ?ナス
  4792. refinebonus[i][2]=atoi(split[2]); // 安全精?限界
  4793. for(j=0;j<10 && split[j];j++)
  4794. percentrefinery[i][j]=atoi(split[j+3]);
  4795. i++;
  4796. }
  4797. fclose(fp); //Lupus. close this file!!!
  4798. sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n","db/refine_db.txt");
  4799. ShowStatus(tmp_output);
  4800. return 0;
  4801. }
  4802. /*==========================================
  4803. * スキル関係初期化処理
  4804. *------------------------------------------
  4805. */
  4806. int do_init_status(void)
  4807. {
  4808. add_timer_func_list(status_change_timer,"status_change_timer");
  4809. status_readdb();
  4810. status_calc_sigma();
  4811. return 0;
  4812. }