From 9bdb2e2f4f1a30f137a4e2b31286c11deef0fc3d Mon Sep 17 00:00:00 2001 From: Nicaragua Date: Sun, 27 Jan 2019 00:11:15 -0300 Subject: [PATCH] blocking projectiles now work, so does melee attacks with empty hands --- .../mob/living/simple_animal/bot/griefsky.dm | 106 ++++++++---------- icons/obj/aibots.dmi | Bin 67228 -> 68346 bytes 2 files changed, 45 insertions(+), 61 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/griefsky.dm b/code/modules/mob/living/simple_animal/bot/griefsky.dm index 7fe395826af..50a3b9cbfc3 100644 --- a/code/modules/mob/living/simple_animal/bot/griefsky.dm +++ b/code/modules/mob/living/simple_animal/bot/griefsky.dm @@ -7,9 +7,9 @@ anchored = 0 health = 150 maxHealth = 150 - base_speed = 4 //he's a fast fucker damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) pass_flags = PASSMOB + radio_channel = "Security" //Security channel bot_type = SEC_BOT @@ -23,9 +23,9 @@ data_hud_type = DATA_HUD_SECURITY_ADVANCED allow_pai = 0 - var/block_chance = 50 // not working yet var/spin_icon = "griefsky-c" // griefsky and griefsky junior have dif icons - var/dmg = 30 + var/dmg = 30 //esword dmg + var/block_chance = 50 //melee var/spam_flag = 0 var/base_icon = "griefsky" var/mob/living/carbon/target @@ -38,11 +38,7 @@ var/weaponscheck = 0 //If true, arrest people for weapons if they lack access var/check_records = 1 //Does it check security records? var/arrest_type = 0 //If true, don't handcuff - var/harmbaton = 1 //If true, beat instead of stun - var/flashing_lights = 0 //If true, flash lights - var/prev_flashing_lights = 0 //REMOVE VARS WHEN DONE!!!!!!!!!!!!!PLEASE SACALAS >:/, ya estna en beepsky - var/onetime = 0 - + /mob/living/simple_animal/bot/griefsky/proc/spam_flag_false() //used for addtimer to not spam comms spam_flag = 0 @@ -62,7 +58,8 @@ /mob/living/simple_animal/bot/griefsky/jgriefsky // cheaper griefsky less damage name = "General griefsky" desc = "It's Prison Ofitser! ." - dmg = 15 + base_speed = 4 //a little bit slower + dmg = 15 //energy daggers spin_icon = "griefskyj-c" /mob/living/simple_animal/bot/griefsky/turn_on() @@ -145,10 +142,7 @@ Auto Patrol: []"}, target = H mode = BOT_HUNT -/mob/living/simple_animal/bot/griefsky/attack_hand(mob/living/carbon/human/H) - if(H.a_intent == INTENT_HARM || H.a_intent == INTENT_DISARM) - retaliate(H) - return ..() + /mob/living/simple_animal/bot/griefsky/attackby(obj/item/W, mob/user, params) ..() @@ -167,13 +161,6 @@ Auto Patrol: []"}, declare_arrests = 0 icon_state = "[base_icon][on]" -/mob/living/simple_animal/bot/griefsky/bullet_act(obj/item/projectile/Proj) //if you fire him it will increase your threat level - if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) - if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) - if(!Proj.nodamage && Proj.damage < src.health) - retaliate(Proj.firer) - ..() - /mob/living/simple_animal/bot/griefsky/UnarmedAttack(atom/A) //when controlled by a player if(!on) return @@ -198,47 +185,24 @@ Auto Patrol: []"}, var/threat = C.assess_threat(src) if(ishuman(C)) C.apply_damage(dmg, BRUTE) - if(prob(99)) + if(prob(50)) C.Weaken(5) add_attack_logs(src, C, "sliced") if(declare_arrests) var/area/location = get_area(src) if(!spam_flag) - speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel) + speak("Back away! i will deal with this level [threat] swine [C] in [location] myself!.", radio_channel) spam_flag = 1 addtimer(CALLBACK(src, .proc/spam_flag_false), 100) //to avoid spamming comms of sec for each hit visible_message("[src] flails his swords and cuts [C]!") -/mob/living/simple_animal/bot/griefsky/Life(seconds, times_fired) - . = ..() - if(flashing_lights) - switch(light_color) - if(LIGHT_COLOR_PURE_RED) - light_color = LIGHT_COLOR_PURE_BLUE - if(LIGHT_COLOR_PURE_BLUE) - light_color = LIGHT_COLOR_PURE_RED - update_light() - else if(prev_flashing_lights) - light_color = LIGHT_COLOR_PURE_RED - update_light() - - prev_flashing_lights = flashing_lights - -/mob/living/simple_animal/bot/griefsky/verb/toggle_flashing_lights() - set name = "Toggle Flashing Lights" - set category = "Object" - set src = usr - - flashing_lights = !flashing_lights - /mob/living/simple_animal/bot/griefsky/handle_automated_action() if(!..()) return - flashing_lights = mode == BOT_HUNT - switch(mode) if(BOT_IDLE) // idle + icon_state = "griefsky1" walk_to(src,0) look_for_perp() // see if any criminals are in range if(!mode && auto_patrol) // still idle, and set to patrol @@ -247,14 +211,14 @@ Auto Patrol: []"}, if(BOT_HUNT) // hunting for perp // if can't reach perp for long enough, go idle icon_state = spin_icon - playsound(src,'sound/effects/spinsabre.ogg',100,1,-1) - if(frustration >= 8) + playsound(loc,'sound/effects/spinsabre.ogg',100,1,-1) + if(frustration >= 20) // general griefsky doesn't give up so easily, jedi scum walk_to(src,0) back_to_idle() return if(target) // make sure target exists - if(target.stat == !DEAD) + if(target.stat == !DEAD) if(Adjacent(target) && isturf(target.loc)) // if right next to perp sword_attack(target) anchored = 1 @@ -262,21 +226,21 @@ Auto Patrol: []"}, return else // not next to perp var/turf/olddist = get_dist(src, target) - walk_to(src, target,1,4) + walk_to(src, target,1,3) //he's a fast fucker if((get_dist(src, target)) >= (olddist)) frustration++ else frustration = 0 - else + else back_to_idle() + speak("You fool") + else + back_to_idle() if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if( !Adjacent(target) || !isturf(target.loc)) - back_to_hunt() - return - else + if(target.stat == DEAD) back_to_idle() return @@ -291,6 +255,7 @@ Auto Patrol: []"}, return /mob/living/simple_animal/bot/griefsky/proc/back_to_idle() + playsound(loc, 'sound/weapons/saberoff.ogg', 50, 1, -1) anchored = 0 mode = BOT_IDLE target = null @@ -320,8 +285,7 @@ Auto Patrol: []"}, else if(threatlevel >= 4) target = C oldtarget_name = C.name - speak("Level [threatlevel] infraction alert!") - playsound(loc, pick('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg'), 50, 0) + speak("You are a bold one") visible_message("[src] points at [C.name]!") playsound(loc, 'sound/weapons/saberon.ogg', 50, 1, -1) mode = BOT_HUNT @@ -370,11 +334,31 @@ Auto Patrol: []"}, return ..() -/mob/living/simple_animal/bot/griefsky/bullet_act(obj/item/projectile/P) - visible_message("[src] deflects [P] with its energy swords!") - playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, 0) +/mob/living/simple_animal/bot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized retaliate(P.firer) - return 0 + if(icon_state == spin_icon) //only when the eswords are on + visible_message("[src] deflects [P] with its energy swords!") + playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, 0) + else + ..() + +/mob/living/simple_animal/bot/griefsky/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked. + return + +/mob/living/simple_animal/bot/griefsky/special_retaliate_after_attack(mob/user) + if(icon_state != spin_icon) + return + if(prob(block_chance)) + visible_message("[src] deflects [user]'s attack with his energy swords!") + playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE, -1) + return TRUE + +/mob/living/simple_animal/bot/griefsky/attack_hand(mob/living/carbon/human/H) + if((H.a_intent == INTENT_HARM) || (H.a_intent == INTENT_DISARM)) + retaliate(H) + if(special_retaliate_after_attack(H)) + return + return ..() /obj/machinery/bot_core/secbot req_access = list(access_security) \ No newline at end of file diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi index a29b2944e9ab63b4fbb6a0118d92fb37959a836d..2d33d44c90d57bcfe0d641b8789ab05b838350c8 100644 GIT binary patch delta 6568 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 delta 5441 zcmai&c|25o-^ULV5;9WZLPH6aq7=$9NR||-P>P{KvL#u<%(0aUQ7RQ8OA9fQknM~t zQ$eX#lvFFdU3l?tA5oeFb_q|5^hVC zp{`CIlKYV7MEJf-NjVZ@lyhKH=8{!G==NNrT7H#BB|Tz%Q5}4HYxW>o^JmFXBQmsQ zf7&wEvKSITz9l6+cXf58%|W2L??(?#;7V()lV1R5+W@oGy>B|iMR(ORgj?)tPRo9)LYz+`;_iG;eLO#z5!bP&Lo8~e>~SqYm*m&p zSHLzRCI&OJgZ}NC8FQt6O9-ug%VzJsFU(nwG2Mq9r_Od)Ub-yURev$|V@iK|+)Cv7$a#q1QXlRjB^4Hyg_bRyqUaX2? zD)Zx)n^GHed;H!4ZDjlN_AD7j%h>)iAB4Z)afe5ytc-jV>qk@@3SOL0v{KnxJM-dT z)@i}d7jJD!H=XG`mPSiD8NNASn*k#uZ*9;(MmM{OEa98~pmC!jbG|GE;W8cG_| zWAUYP2N)h|!fpxL=`W^ycT5sTZIB9~ltm>^-+l1*0jI0$+}NmCf>7;kIYqr|s#<8p zP`gzLq1*MA*xGxj*B}c&--0SgC8NC2B(x5s7hf!x! zRLWw(u<2tWa$k zlN+{pMnoqyb?AsW#A!`6ren38f54TOS_jVIwA&Vg<)`UUV*zal{>M;TO2~8Vla}v? z7L+29hI1h@0*-LGUcN>;@98VKwc9x-z<9lUBy!UMVFI@_G`zzjDG$OoreD>79o#yC zQvAQ0$yWn0+~x{bBtymEGBQ#ap~fxaJp1`;54b!9dJ{4at6*E(%3OFcii=Y zo0dbRkbZzE8gU)2-XsFIx@jZ}v@`?B$QI_>Fd|k0p-bw3(n6XSplAj@ni20bcc4$b zNyX8pM78l6z*043Cy<2>fvltq#y$xX6wFQs2M61eBNNNl7HjR|#5e{_CJyWdPK++z zYUM5H_V_aEr~8@ok1AFxL^x2CUYRJ4?k(eXOz*H&0+?`K-lpJ$;$_LElp}uiYH?s| z#M+XsT~I|};bIVP_xmXZj(#$j5EHLpX5B7AJ5KWi^ht((GOk5C9A0q)U5nP6A0h)M zjIgdQF7xA`-Fhpf14nL;0HG0h6hBaid%vB*G$U#oaChu?_ezj6px985t$f_@sk5J- z-xgOF&}F{mp15fUm9MgV#{KQycHb3BU%?j9BG1|!qD6XE7THfIuMbxLH8SIbdeR=W>tYt8`g>0 z^jxqUTw1mIH*UJOvEe9W&Bo3`Yp7mn@h2%o{0-AKs%Q&7%c>dt&}6|77>X-p`_Q62 zVZPIAHHtVXL7&Get&K?lxSsMX$k0QLK$ckbND_w95No<*4yRP@jRpR4Ols(hkJc*%nZX%ALKEdnx0D}U8sKFxo6-5vRx7P}6L#sg6=e?K? zL)3wCT(z@ujm-NUA0q_QbTp$Jcy08-XNaPQ1jsKJy*L|DDlBbO`7V~4Np=_?+d9~ z{A+VTGlyNll8=cLsCSV}$zvJpR^bX2BQuzE*cy6aE zYiLDk4QV2G6wI!9dxQ8KIRea|>cvH;UhdEcd9z0^nq0(P@DcUqUMq^z?*;?xA5fo1A8Lg#^ zH$RH<1wDn5uFq4ewN~g(rW|JVaXWPKk^n_B8KD8M32VL^JMSyJRQJ$kG(o)R*Kg2R zf-=mh;r!AvP!twDn+jMg|H+(xA_wF$howaG>b@^PDjIITtn{;`h4-PY)#L0NZ#qlc zSBL*H*2Z7xP*R5MhX=W%_T179^XRxq4Br+JTZRJYnAJm}d>H1pEWO@mrABKj!I2&8 zEXc?avdwd-)t*V&+4+lt0PHSY-~nKz27a(c<@C;-dq27$M2`R$NiQQ+>-4StMta3Z zQay#nF4f#~^WPpMZ-L9u7FT6+b3s913OdR(u9;%KNo8xTE`Gab6m;#J>{L`Xg-`t7 zm^PM-J8Wwf?0c(QEw+;8uJA(h#;+sOW(;5~s9otXMYmUcyXcqj0~DW-JK| zKzNs5mjSp-41{*XSzk#--#ek0LC1>y)>=z2nOUHc1LWss94-IIT$cc!l(=uL+3yO#fvG*o|{7b zHSUM_19{CdZsJ^gSsMB9Y~JpQXXs3d)$`=!8h3Bqu+|9^t8zb~#g8AK(2VS~eWAv3 zgO%Ln>KHku#rhua9D(=GiH=imU~@GbF{P769}3W3XAU03>H27Mrtr=mPQC3ey0vIb zv$EXn{JdiWsC_gIw;Fp#pQnup$SXtsXn-(>yn2c_u#C*~7rtp?Ynx?maozWp)C7gF z{~SH#4{ai-GYEY=4$t$ppHj$TEt}YL(wHt`@hgW?G{`@GApPf##6Tq!Jp~fUz5WKh z!6ZknQ55RdyXe62`C^Jbf!Gf*FQEWOu(E_7@Qc!CEzf)i+5FI^6qX3>G3%1Rh4hh> zcM}j?j!Al4xFEgx*t^WE0SqMm;sXqI?N?GWsDQOEPAjobGvl4lpHxgx-WomZce3*I zyU2@qGQj;pJA9uL^p<%krLm6{49FqT`C@@n!GkeK#$dZ@uW_5b-~i|$eAYvql-D$K z+XaQFJj1#qO+vrKeTXHaETOKtWm>1VhLXF7hsrDE`zyB3XDj9m_9aFHf*u}?RutPE zEAUy2ye=>%!APTosWT=LF(t9=?rq^0RW@grrg-mD9eG7;En&Uc?In|x8`L}{S!fS! zgX#!V#S^X!BB^;9j4S4<0(ZYnQyv8s($xLDyz*RR&6;>qtw~F6HP@KN&IhwGDmKzj z2RwW(nmuaEs4&4UfLDj`B*g2z7lS3>lgTyQofkuJ{n$yCU5(@{f$d{?Ie&>n`z;Gm zBbE|T)}ErFwj8c1R~Ggy<9V8xUZeq45PGUSje3ew#%tTCUKi8d=TM)9wu8oG)WUGW zZ62Fm-(|+uIaUl3CDmB$)oykbow}&Td=}vtu>Q+~0XGJNye6_ASrOEP6-TXgZU@CI zwexm06qKG*K8w4yXP*vP;(oyZXDPEfVUGtc0BxG!1d@u zbTi*eU5KaqHs*-NJa#;U%SKnl%q@SqoUe^3A5;d?;nZgY&?r?{0rX<+z@eoBy}hB_ z935hqg{UPXo?2QcFt;K6Zv3k46Mc*toKA$8j^|x}pmI^6-ne3J&7Z4gizKtZsHSc%*fiuI7~!y*J^TWPf||nw@Qp{_RfLD|Eqoh}XJ~ z#-@)lv#0Am6}MoefgeSuWQou1@BZm3;N#JIN0RdT7uP_uM;Bj z00J1aFmRQ1?%48b0>I=T)7E;1J~M?0rpX_K30KbBY&mB3wcveTUfwW_Q->oyy!Y^x zgv0=>$fvBJjhu=LMZ;A^xq;L!v%MbbVQ6U$SoWYIpYw+EyXHuLZNWL?qXq5`dD49=*mm*28z4 zA=my|_6X%r3WnCxhQ~H5<1c`ZK{CAcXEXuvMS-P&g9!-mBSkh}%z_Ay}fad%W7& zNjP@gGu1rna068%EL*Ilu?x2~b9tX>{w-hEF^=xL$If;jel0QRl+Q(?-PNd}Uu{`` zap3nK=DGt!IM~%W2?Nt+UyQYe%|5F*4w!a5`94+5;Hy3D}v~an4b-i|g zY#j_8nD(AyK0@#wqf$68-5I+LzK*>!4`lZYbgZCQqi@!N5ruf;VH0;~1MdB_Dj1$N z^~tOGsG}9Vc7L;yl1wq@>I5}%pu*9DIm_CfsaMp&lkg9?zgUC2j^LS0>df{`c$2GX zahW%EhaQhhTyHqNio%We-Jp+d1qiU>=Pe(VW|q9;R5zDLzZ~64w_l+)oGQ`flnC?5 zkGC;5oMybr0V@{&l9tY4Vov03mPk)m9`-)@7a)o0$vd*DwiTs=V~}x3H*^S7v*FBl z0O0jDGcq_k-^oCxL;G34ZpL7TYLG$lN?7a+QkfRXAdZHGjjSftU2W9=DAVAk| z%)>|r@?0lt9z`oC2BkD!pN=bKO~pl}>N+ZX_h=Dtc;fKpJ@w3NSZwt7SuZ8n?rYSS zY)tEw<^xQhLTQCOR@Tk708S|&qWx9{<5Pv0|2tZhTPMZEtVY_zE=&w$jtw$OcYu0_ zADUW<sCGD}1|zp=OXir4)HKfzZsk$mgi_Q{B`^PO(xe=8kN{uNTxvDG}`Iy}nm!5UqL& znT%l!b<7a;R)#t#0*?JV#y=6G~i4XH-rV}h*zey)u$s-e$ z-6z*b88n|205adyhduKL3o8*RHd$ObaQ46>wr+Of$M7zQdy<=LBIa1U_0_q$-}XvZ z=Zjdt^MbSS-8I7!d!}%B@~jE6DiMeI1v`Ufox}Og@>SbZ;Z7{>>HtF8E1T}h#q>&b z34RIRSP4G`X(A!`_vmZuH+M<$i)7Hukx>r$X}t0|Sf}}8>*Yr+hB-VFV8Qs}4Qw6& Of6R_q808r{hW`&xBO>eo