mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-28 22:47:59 +01:00
Merge pull request #10750 from Nicaragua1/General_Griefsky
General Griefsky
This commit is contained in:
@@ -81,6 +81,19 @@
|
||||
time = 60
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/griefsky
|
||||
name = "General Griefsky"
|
||||
result = /mob/living/simple_animal/bot/secbot/griefsky
|
||||
reqs = list(/obj/item/assembly/signaler = 1,
|
||||
/obj/item/clothing/head/helmet = 1,
|
||||
/obj/item/melee/energy/sword = 4,
|
||||
/obj/item/assembly/prox_sensor = 1,
|
||||
/obj/item/robot_parts/r_arm = 2,
|
||||
/obj/item/robot_parts/l_arm = 2)
|
||||
tools = list(/obj/item/weldingtool)
|
||||
time = 120
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/cleanbot
|
||||
name = "Cleanbot"
|
||||
result = /mob/living/simple_animal/bot/cleanbot
|
||||
|
||||
@@ -389,8 +389,8 @@
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "helmet_signaler"
|
||||
item_state = "helmet"
|
||||
var/created_name = "Griefsky" //To preserve the name if it's a unique securitron I guess
|
||||
var/build_step = 0
|
||||
var/created_name = "Securitron" //To preserve the name if it's a unique securitron I guess
|
||||
|
||||
/obj/item/clothing/head/helmet/attackby(obj/item/assembly/signaler/S, mob/user, params)
|
||||
..()
|
||||
@@ -481,6 +481,68 @@
|
||||
to_chat(user, "<span class='notice'>You remove the robot arm from [src].</span>")
|
||||
build_step--
|
||||
|
||||
//General Griefsky
|
||||
|
||||
else if((istype(I, /obj/item/wrench)) && (build_step == 3))
|
||||
var/obj/item/griefsky_assembly/A = new /obj/item/griefsky_assembly
|
||||
user.put_in_hands(A)
|
||||
to_chat(user, "<span class='notice'>You adjust the arm slots for extra weapons!.</span>")
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/griefsky_assembly
|
||||
name = "\improper Griefsky assembly"
|
||||
desc = "Some sort of bizarre assembly."
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "griefsky_assembly"
|
||||
item_state = "griefsky_assembly"
|
||||
var/build_step = 0
|
||||
var/toy_step = 0
|
||||
|
||||
/obj/item/griefsky_assembly/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if((istype(I, /obj/item/melee/energy/sword)) && (build_step < 3 ))
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
build_step++
|
||||
to_chat(user, "<span class='notice'>You add an energy sword to [src]!.</span>")
|
||||
qdel(I)
|
||||
|
||||
else if((istype(I, /obj/item/melee/energy/sword)) && (build_step == 3))
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You complete General Griefsky!.</span>")
|
||||
var/mob/living/simple_animal/bot/secbot/griefsky/S = new /mob/living/simple_animal/bot/secbot/griefsky
|
||||
S.forceMove(get_turf(src))
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
|
||||
else if((istype(I, /obj/item/toy/sword)) && (toy_step < 3 ))
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
toy_step++
|
||||
to_chat(user, "<span class='notice'>You add a toy sword to [src]!.</span>")
|
||||
qdel(I)
|
||||
|
||||
else if((istype(I, /obj/item/toy/sword)) && (toy_step == 3))
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You complete Genewul Giftskee!.</span>")
|
||||
var/mob/living/simple_animal/bot/secbot/griefsky/toy/S = new /mob/living/simple_animal/bot/secbot/griefsky/toy
|
||||
S.forceMove(get_turf(src))
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
if((build_step == 1) || (build_step == 2) || (build_step == 3) || (build_step == 4))
|
||||
new /obj/item/melee/energy/sword(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the energy sword from [src].</span>")
|
||||
build_step--
|
||||
else if((toy_step == 1) || (toy_step == 2) || (toy_step == 3) || (toy_step == 4))
|
||||
new /obj/item/toy/sword(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You detach the toy sword from [src].</span>")
|
||||
toy_step--
|
||||
|
||||
//Honkbot Assembly
|
||||
/obj/item/storage/box/clown/attackby(obj/item/W, mob/user, params)
|
||||
if(!istype(W, /obj/item/robot_parts/l_arm) && !istype(W, /obj/item/robot_parts/r_arm))
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
/mob/living/simple_animal/bot/secbot/griefsky //This bot is powerful. If you managed to get 4 eswords somehow, you deserve this horror. Emag him for best results.
|
||||
name = "\improper General Griefsky"
|
||||
desc = "Is that a secbot with four eswords in its arms...?"
|
||||
icon_state = "griefsky0"
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
base_icon = "griefsky"
|
||||
window_name = "Automatic Security Unit v3.0"
|
||||
|
||||
var/spin_icon = "griefsky-c" // griefsky and griefsky junior have dif icons
|
||||
var/weapon = /obj/item/melee/energy/sword
|
||||
var/block_chance = 50 //block attacks
|
||||
var/reflect_chance = 80 // chance to reflect projectiles
|
||||
var/dmg = 30 //esword dmg
|
||||
var/block_chance_melee = 50
|
||||
var/block_chance_ranged = 90
|
||||
var/stun_chance = 50
|
||||
var/spam_flag = 0
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/toy //A toy version of general griefsky!
|
||||
name = "Genewul Giftskee"
|
||||
desc = "An adorable looking secbot with four toy swords taped to its arms"
|
||||
spin_icon = "griefskyj-c"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
radio_channel = "Service" //we dont report sec anymore!
|
||||
dmg = 0
|
||||
block_chance_melee = 1
|
||||
block_chance_ranged = 1
|
||||
stun_chance = 0
|
||||
bot_core_type = /obj/machinery/bot_core/toy
|
||||
weapon = /obj/item/toy/sword
|
||||
|
||||
/obj/machinery/bot_core/toy
|
||||
req_access = list(access_maint_tunnels, access_theatre, access_robotics)
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/proc/spam_flag_false() //used for addtimer to not spam comms
|
||||
spam_flag = 0
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/back_to_idle()
|
||||
..()
|
||||
playsound(loc, 'sound/weapons/saberoff.ogg', 50, 1, -1)
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/emag_act(mob/user)
|
||||
..()
|
||||
light_color = LIGHT_COLOR_PURE_RED //if you see a red one. RUN!!
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/Crossed(atom/movable/AM)
|
||||
..()
|
||||
if(ismob(AM) && AM == target)
|
||||
var/mob/living/carbon/C = AM
|
||||
visible_message("[src] flails his swords and pushes [C] out of it's way!" )
|
||||
C.Weaken(2)
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/New()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/Destroy()
|
||||
QDEL_NULL(weapon)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/UnarmedAttack(atom/A) //like secbots its only possible with admin intervention
|
||||
if(!on)
|
||||
return
|
||||
if(iscarbon(A))
|
||||
var/mob/living/carbon/C = A
|
||||
sword_attack(C)
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized
|
||||
retaliate(P.firer)
|
||||
if((icon_state == spin_icon) && (prob(block_chance_ranged))) //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/secbot/griefsky/proc/sword_attack(mob/living/carbon/C) // esword attack
|
||||
src.do_attack_animation(C)
|
||||
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1, -1)
|
||||
spawn(2)
|
||||
icon_state = spin_icon
|
||||
var/threat = C.assess_threat(src)
|
||||
if(ishuman(C))
|
||||
C.apply_damage(dmg, BRUTE)
|
||||
if(prob(stun_chance))
|
||||
C.Weaken(5)
|
||||
add_attack_logs(src, C, "sliced")
|
||||
if(declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
if(!spam_flag)
|
||||
speak("Back away! I will deal with this level [threat] swine <b>[C]</b> 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/secbot/griefsky/handle_automated_action()
|
||||
if(!on)
|
||||
return
|
||||
|
||||
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
|
||||
mode = BOT_START_PATROL // switch to patrol mode
|
||||
if(BOT_HUNT) // hunting for perp
|
||||
icon_state = spin_icon
|
||||
playsound(loc,'sound/effects/spinsabre.ogg',100,1,-1)
|
||||
if(frustration >= 15) // general beepsky 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(Adjacent(target) && isturf(target.loc)) // if right next to perp
|
||||
target_lastloc = target.loc
|
||||
sword_attack(target)
|
||||
anchored = TRUE
|
||||
frustration++
|
||||
return
|
||||
else // not next to perp
|
||||
var/turf/olddist = get_dist(src, target)
|
||||
walk_to(src, target,1,3) //he's a fast fucker
|
||||
if((get_dist(src, target)) >= (olddist))
|
||||
frustration++
|
||||
else
|
||||
frustration = 0
|
||||
else
|
||||
back_to_idle()
|
||||
speak("You fool")
|
||||
else
|
||||
back_to_idle()
|
||||
|
||||
if(BOT_START_PATROL)
|
||||
look_for_perp()
|
||||
start_patrol()
|
||||
|
||||
if(BOT_PATROL)
|
||||
icon_state = "griefsky1"
|
||||
look_for_perp()
|
||||
bot_patrol()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/look_for_perp()
|
||||
anchored = 0
|
||||
for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
|
||||
if((C.stat) || (C.handcuffed))
|
||||
continue
|
||||
|
||||
if((C.name == oldtarget_name) && (world.time < last_found + 100))
|
||||
continue
|
||||
|
||||
threatlevel = C.assess_threat(src)
|
||||
|
||||
if(!threatlevel)
|
||||
continue
|
||||
|
||||
else if(threatlevel >= 4)
|
||||
target = C
|
||||
oldtarget_name = C.name
|
||||
speak("You are a bold one")
|
||||
playsound(src,'sound/weapons/saberon.ogg',50,TRUE,-1)
|
||||
visible_message("[src] ignites his energy swords!")
|
||||
icon_state = "griefsky-c"
|
||||
visible_message("<b>[src]</b> points at [C.name]!")
|
||||
mode = BOT_HUNT
|
||||
INVOKE_ASYNC(src, .proc/handle_automated_action)
|
||||
break
|
||||
else
|
||||
continue
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/explode()
|
||||
walk_to(src,0)
|
||||
visible_message("<span class='boldannounce'>[src] lets out a huge cough as it blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
new /obj/item/assembly/prox_sensor(Tsec)
|
||||
if(prob(50))
|
||||
new /obj/item/robot_parts/r_arm(Tsec)
|
||||
if(prob(50)) //most of the time weapon will be destroyed
|
||||
new weapon(Tsec)
|
||||
if(prob(25))
|
||||
new weapon(Tsec)
|
||||
if(prob(10))
|
||||
new weapon(Tsec)
|
||||
if(prob(5))
|
||||
new weapon(Tsec)
|
||||
do_sparks(3, 1, src)
|
||||
new /obj/effect/decal/cleanable/blood/oil(loc)
|
||||
..()
|
||||
|
||||
//this section is blocking attack
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized
|
||||
retaliate(P.firer)
|
||||
if((icon_state == spin_icon) && (prob(block_chance_ranged))) //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/secbot/griefsky/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked.
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/special_retaliate_after_attack(mob/user)
|
||||
if(icon_state != spin_icon)
|
||||
return
|
||||
if(prob(block_chance_melee))
|
||||
visible_message("[src] deflects [user]'s attack with his energy swords!")
|
||||
playsound(loc, 'sound/weapons/blade1.ogg', 50, TRUE, -1)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/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 ..()
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/griefsky/attackby(obj/item/W, mob/user, params) //cant touch or attack him while spinning
|
||||
if(src.icon_state == spin_icon)
|
||||
if(prob(block_chance_melee))
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
visible_message("[src] deflects [user]'s move with his energy swords!")
|
||||
playsound(loc, 'sound/weapons/blade1.ogg', 50, TRUE, -1)
|
||||
else
|
||||
..()
|
||||
else
|
||||
..()
|
||||
@@ -121,7 +121,7 @@
|
||||
dat += hack(user)
|
||||
dat += showpai(user)
|
||||
dat += text({"
|
||||
<TT><B>Securitron v1.6 controls</B></TT><BR><BR>
|
||||
<TT><B>[window_name]</B></TT><BR><BR>
|
||||
Status: []<BR>
|
||||
Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
|
||||
Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
|
||||
Reference in New Issue
Block a user