Citadel's folder's end (#5828)
* ERP, miscreants, clothing * github pls * guns, dogborg, areas, vendor * finishes moving around the last of the stuffs * cleaned up shit. italics on subtle messages vore code to modular_citadel too * updates codeowners and recompiles tgui because it's a healthy thing to do * reee, I had that spawner set byond * cleans up a bad pipe does the thing I've been meaning to do for a while now as well. * bumps up xenobio console requirements inb4 reee * snowflake commenting
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
//Disables the custom emote blacklist from TG that normally applies to slimes.
|
||||
/datum/emote/living/custom
|
||||
mob_type_blacklist_typecache = list(/mob/living/brain)
|
||||
@@ -0,0 +1,76 @@
|
||||
/obj/item/robot_module/loader
|
||||
name = "loader robot module"
|
||||
/obj/item/robot_module/loader/New()
|
||||
..()
|
||||
emag = new /obj/item/borg/stun(src)
|
||||
modules += new /obj/item/extinguisher(src)
|
||||
modules += new /obj/item/weldingtool/largetank/cyborg(src)
|
||||
modules += new /obj/item/screwdriver(src)
|
||||
modules += new /obj/item/wrench(src)
|
||||
modules += new /obj/item/crowbar(src)
|
||||
modules += new /obj/item/wirecutters(src)
|
||||
modules += new /obj/item/device/multitool(src)
|
||||
modules += new /obj/item/device/t_scanner(src)
|
||||
modules += new /obj/item/device/analyzer(src)
|
||||
modules += new /obj/item/device/assembly/signaler
|
||||
modules += new /obj/item/soap/nanotrasen(src)
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/k9
|
||||
name = "Security K-9 Unit module"
|
||||
/obj/item/robot_module/k9/New()
|
||||
..()
|
||||
modules += new /obj/item/restraints/handcuffs/cable/zipties/cyborg/dog(src)
|
||||
modules += new /obj/item/dogborg/jaws/big(src)
|
||||
modules += new /obj/item/dogborg/pounce(src)
|
||||
modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
|
||||
modules += new /obj/item/soap/tongue(src)
|
||||
modules += new /obj/item/device/analyzer/nose(src)
|
||||
modules += new /obj/item/storage/bag/borgdelivery(src)
|
||||
//modules += new /obj/item/device/assembly/signaler(src)
|
||||
//modules += new /obj/item/device/detective_scanner(src)
|
||||
modules += new /obj/item/gun/energy/disabler/cyborg(src)
|
||||
emag = new /obj/item/gun/energy/laser/cyborg(src)
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
..()
|
||||
var/obj/item/gun/energy/gun/advtaser/cyborg/T = locate(/obj/item/gun/energy/gun/advtaser/cyborg) in get_usable_modules()
|
||||
if(T)
|
||||
if(T.power_supply.charge < T.power_supply.maxcharge)
|
||||
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
|
||||
T.power_supply.give(S.e_cost * coeff)
|
||||
T.update_icon()
|
||||
else
|
||||
T.charge_tick = 0
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/borgi
|
||||
name = "Borgi module"
|
||||
|
||||
/obj/item/robot_module/borgi/New()
|
||||
..()
|
||||
modules += new /obj/item/dogborg/jaws/small(src)
|
||||
modules += new /obj/item/storage/bag/borgdelivery(src)
|
||||
modules += new /obj/item/soap/tongue(src)
|
||||
modules += new /obj/item/device/healthanalyzer(src)
|
||||
modules += new /obj/item/device/analyzer/nose(src)
|
||||
emag = new /obj/item/dogborg/pounce(src)
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/medihound
|
||||
name = "MediHound module"
|
||||
|
||||
/obj/item/robot_module/medihound/New()
|
||||
..()
|
||||
modules += new /obj/item/dogborg/jaws/small(src)
|
||||
modules += new /obj/item/storage/bag/borgdelivery(src)
|
||||
modules += new /obj/item/device/analyzer/nose(src)
|
||||
modules += new /obj/item/soap/tongue(src)
|
||||
modules += new /obj/item/device/healthanalyzer(src)
|
||||
modules += new /obj/item/dogborg/sleeper(src)
|
||||
modules += new /obj/item/twohanded/shockpaddles/hound(src)
|
||||
modules += new /obj/item/device/sensor_device(src)
|
||||
emag = new /obj/item/dogborg/pounce(src)
|
||||
fix_modules()
|
||||
@@ -0,0 +1,401 @@
|
||||
/*
|
||||
DOG BORG EQUIPMENT HERE
|
||||
SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
|
||||
*/
|
||||
|
||||
/obj/item/dogborg/jaws/big
|
||||
name = "combat jaws"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "jaws"
|
||||
desc = "The jaws of the law."
|
||||
flags_1 = CONDUCT_1
|
||||
force = 12
|
||||
throwforce = 0
|
||||
hitsound = 'sound/weapons/bite.ogg'
|
||||
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
|
||||
w_class = 3
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/dogborg/jaws/small
|
||||
name = "puppy jaws"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "smalljaws"
|
||||
desc = "The jaws of a small dog."
|
||||
flags_1 = CONDUCT_1
|
||||
force = 6
|
||||
throwforce = 0
|
||||
hitsound = 'sound/weapons/bite.ogg'
|
||||
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
|
||||
w_class = 3
|
||||
sharpness = IS_SHARP
|
||||
|
||||
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
|
||||
..()
|
||||
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
|
||||
|
||||
/obj/item/dogborg/jaws/small/attack_self(mob/user)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
if(R.emagged)
|
||||
name = "combat jaws"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "jaws"
|
||||
desc = "The jaws of the law."
|
||||
flags_1 = CONDUCT_1
|
||||
force = 12
|
||||
throwforce = 0
|
||||
hitsound = 'sound/weapons/bite.ogg'
|
||||
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
|
||||
w_class = 3
|
||||
sharpness = IS_SHARP
|
||||
else
|
||||
name = "puppy jaws"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "smalljaws"
|
||||
desc = "The jaws of a small dog."
|
||||
flags_1 = CONDUCT_1
|
||||
force = 5
|
||||
throwforce = 0
|
||||
hitsound = 'sound/weapons/bite.ogg'
|
||||
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
|
||||
w_class = 3
|
||||
sharpness = IS_SHARP
|
||||
update_icon()
|
||||
|
||||
|
||||
//Cuffs
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
|
||||
if(!C.handcuffed)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 60, 1, -2)
|
||||
C.visible_message("<span class='danger'>[user] is trying to put zipties on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put zipties on [C]!</span>")
|
||||
if(do_mob(user, C, 60))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
|
||||
C.update_inv_handcuffed(0)
|
||||
to_chat(user,"<span class='notice'>You handcuff [C].</span>")
|
||||
playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
|
||||
add_logs(user, C, "handcuffed")
|
||||
else
|
||||
to_chat(user,"<span class='warning'>You fail to handcuff [C]!</span>")
|
||||
|
||||
|
||||
//Boop
|
||||
|
||||
/obj/item/device/analyzer/nose
|
||||
name = "boop module"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "nose"
|
||||
desc = "The BOOP module"
|
||||
flags_1 = CONDUCT_1
|
||||
force = 0
|
||||
throwforce = 0
|
||||
attack_verb = list("nuzzled", "nosed", "booped")
|
||||
w_class = 1
|
||||
|
||||
/obj/item/device/analyzer/nose/attack_self(mob/user)
|
||||
user.visible_message("[user] sniffs around the air.", "<span class='warning'>You sniff the air for gas traces.</span>")
|
||||
|
||||
var/turf/location = user.loc
|
||||
if(!istype(location))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles()
|
||||
|
||||
to_chat(user, "<span class='info'><B>Results:</B></span>")
|
||||
if(abs(pressure - ONE_ATMOSPHERE) < 10)
|
||||
to_chat(user, "<span class='info'>Pressure: [round(pressure,0.1)] kPa</span>")
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Pressure: [round(pressure,0.1)] kPa</span>")
|
||||
if(total_moles)
|
||||
var/list/env_gases = environment.gases
|
||||
|
||||
environment.assert_gases(arglist(GLOB.hardcoded_gases))
|
||||
var/o2_concentration = env_gases[/datum/gas/oxygen][MOLES]/total_moles
|
||||
var/n2_concentration = env_gases[/datum/gas/nitrogen][MOLES]/total_moles
|
||||
var/co2_concentration = env_gases[/datum/gas/carbon_dioxide][MOLES]/total_moles
|
||||
var/plasma_concentration = env_gases[/datum/gas/plasma][MOLES]/total_moles
|
||||
environment.garbage_collect()
|
||||
|
||||
if(abs(n2_concentration - N2STANDARD) < 20)
|
||||
to_chat(user, "<span class='info'>Nitrogen: [round(n2_concentration*100, 0.01)] %</span>")
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Nitrogen: [round(n2_concentration*100, 0.01)] %</span>")
|
||||
|
||||
if(abs(o2_concentration - O2STANDARD) < 2)
|
||||
to_chat(user, "<span class='info'>Oxygen: [round(o2_concentration*100, 0.01)] %</span>")
|
||||
else
|
||||
to_chat(user, "<span class='alert'>Oxygen: [round(o2_concentration*100, 0.01)] %</span>")
|
||||
|
||||
if(co2_concentration > 0.01)
|
||||
to_chat(user, "<span class='alert'>CO2: [round(co2_concentration*100, 0.01)] %</span>")
|
||||
else
|
||||
to_chat(user, "<span class='info'>CO2: [round(co2_concentration*100, 0.01)] %</span>")
|
||||
|
||||
if(plasma_concentration > 0.005)
|
||||
to_chat(user, "<span class='alert'>Plasma: [round(plasma_concentration*100, 0.01)] %</span>")
|
||||
else
|
||||
to_chat(user, "<span class='info'>Plasma: [round(plasma_concentration*100, 0.01)] %</span>")
|
||||
|
||||
|
||||
for(var/id in env_gases)
|
||||
if(id in GLOB.hardcoded_gases)
|
||||
continue
|
||||
var/gas_concentration = env_gases[id][MOLES]/total_moles
|
||||
to_chat(user, "<span class='alert'>[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %</span>")
|
||||
to_chat(user, "<span class='info'>Temperature: [round(environment.temperature-T0C)] °C</span>")
|
||||
|
||||
/obj/item/device/analyzer/nose/AltClick(mob/user) //Barometer output for measuring when the next storm happens
|
||||
. = ..()
|
||||
|
||||
//Delivery
|
||||
|
||||
/obj/item/storage/bag/borgdelivery
|
||||
name = "fetching storage"
|
||||
desc = "Fetch the thing!"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "dbag"
|
||||
//Can hold one big item at a time. Drops contents on unequip.(see inventory.dm)
|
||||
w_class = 5
|
||||
max_w_class = 2
|
||||
max_combined_w_class = 2
|
||||
storage_slots = 1
|
||||
collection_mode = 0
|
||||
can_hold = list() // any
|
||||
cant_hold = list(/obj/item/disk/nuclear)
|
||||
|
||||
|
||||
//Tongue stuff
|
||||
|
||||
/obj/item/soap/tongue
|
||||
name = "synthetic tongue"
|
||||
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "synthtongue"
|
||||
hitsound = 'sound/effects/attackblob.ogg'
|
||||
cleanspeed = 80
|
||||
|
||||
/obj/item/soap/tongue/scrubpup
|
||||
cleanspeed = 25 //slightly faster than a mop.
|
||||
|
||||
/obj/item/soap/tongue/New()
|
||||
..()
|
||||
flags_1 |= NOBLUDGEON_1 //No more attack messages
|
||||
|
||||
/obj/item/trash/rkibble
|
||||
name = "robo kibble"
|
||||
desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state= "kibble"
|
||||
|
||||
/obj/item/soap/tongue/attack_self(mob/user)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
if(R.emagged)
|
||||
name = "hacked tongue of doom"
|
||||
desc = "Your tongue has been upgraded successfully. Congratulations."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "syndietongue"
|
||||
cleanspeed = 10 //(nerf'd)tator soap stat
|
||||
else
|
||||
name = "synthetic tongue"
|
||||
desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "synthtongue"
|
||||
cleanspeed = initial(cleanspeed)
|
||||
update_icon()
|
||||
|
||||
/obj/item/soap/tongue/afterattack(atom/target, mob/user, proximity)
|
||||
var/mob/living/silicon/robot.R = user
|
||||
if(!proximity || !check_allowed_items(target))
|
||||
return
|
||||
if(R.client && (target in R.client.screen))
|
||||
to_chat(R, "<span class='warning'>You need to take that [target.name] off before cleaning it!</span>")
|
||||
else if(is_cleanable(target))
|
||||
R.visible_message("[R] begins to lick off \the [target.name].", "<span class='warning'>You begin to lick off \the [target.name]...</span>")
|
||||
if(do_after(R, src.cleanspeed, target = target))
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
to_chat(R, "<span class='notice'>You finish licking off \the [target.name].</span>")
|
||||
qdel(target)
|
||||
R.cell.give(50)
|
||||
else if(isobj(target)) //hoo boy. danger zone man
|
||||
if(istype(target,/obj/item/trash))
|
||||
R.visible_message("[R] nibbles away at \the [target.name].", "<span class='warning'>You begin to nibble away at \the [target.name]...</span>")
|
||||
if(do_after(R, src.cleanspeed, target = target))
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
qdel(target)
|
||||
R.cell.give(250)
|
||||
return
|
||||
if(istype(target,/obj/item/stock_parts/cell))
|
||||
R.visible_message("[R] begins cramming \the [target.name] down its throat.", "<span class='warning'>You begin cramming \the [target.name] down your throat...</span>")
|
||||
if(do_after(R, 50, target = target))
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't eat them.
|
||||
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
var/obj/item/stock_parts/cell.C = target
|
||||
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
|
||||
qdel(target)
|
||||
return
|
||||
var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT
|
||||
if(!I.anchored && R.emagged)
|
||||
R.visible_message("[R] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "<span class='warning'>You begin chewing up \the [target.name]...</span>")
|
||||
if(do_after(R, 100, target = I)) //Nerf dat time yo
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check. Even emags don't make you magically eat things at range.
|
||||
return //If they moved away, you can't eat them.
|
||||
visible_message("<span class='warning'>[R] chews up \the [target.name] and cleans off the debris!</span>")
|
||||
to_chat(R, "<span class='notice'>You finish off \the [target.name].</span>")
|
||||
qdel(I)
|
||||
R.cell.give(500)
|
||||
return
|
||||
R.visible_message("[R] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
|
||||
if(do_after(R, src.cleanspeed, target = target))
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't clean them.
|
||||
to_chat(R,"<span class='notice'>You clean \the [target.name].</span>")
|
||||
var/obj/effect/decal/cleanable/C = locate() in target
|
||||
qdel(C)
|
||||
SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
else if(ishuman(target))
|
||||
if(R.emagged)
|
||||
var/mob/living/L = target
|
||||
if(R.cell.charge <= 666)
|
||||
return
|
||||
L.Stun(4) // normal stunbaton is force 7 gimme a break good sir!
|
||||
L.Knockdown(80)
|
||||
L.apply_effect(STUTTER, 4)
|
||||
L.visible_message("<span class='danger'>[R] has shocked [L] with its tongue!</span>", \
|
||||
"<span class='userdanger'>[R] has shocked you with its tongue! You can feel the betrayal.</span>")
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
R.cell.use(666)
|
||||
else
|
||||
R.visible_message("<span class='warning'>\the [R] affectionally licks \the [target]'s face!</span>", "<span class='notice'>You affectionally lick \the [target]'s face!</span>")
|
||||
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
return
|
||||
else if(istype(target, /obj/structure/window))
|
||||
R.visible_message("[R] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
|
||||
if(do_after(R, src.cleanspeed, target = target))
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't clean them.
|
||||
to_chat(R, "<span class='notice'>You clean \the [target.name].</span>")
|
||||
target.color = initial(target.color)
|
||||
else
|
||||
R.visible_message("[R] begins to lick \the [target.name] clean...", "<span class='notice'>You begin to lick \the [target.name] clean...</span>")
|
||||
if(do_after(R, src.cleanspeed, target = target))
|
||||
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
|
||||
return //If they moved away, you can't clean them.
|
||||
to_chat(R, "<span class='notice'>You clean \the [target.name].</span>")
|
||||
var/obj/effect/decal/cleanable/C = locate() in target
|
||||
qdel(C)
|
||||
SendSignal(COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
|
||||
return
|
||||
|
||||
|
||||
//Defibs
|
||||
|
||||
/obj/item/twohanded/shockpaddles/cyborg/hound
|
||||
name = "Paws of Life"
|
||||
desc = "MediHound specific shock paws."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "defibpaddles0"
|
||||
item_state = "defibpaddles0"
|
||||
|
||||
// Pounce stuff for K-9
|
||||
|
||||
/obj/item/dogborg/pounce
|
||||
name = "pounce"
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "pounce"
|
||||
desc = "Leap at your target to momentarily stun them."
|
||||
force = 0
|
||||
throwforce = 0
|
||||
|
||||
/obj/item/dogborg/pounce/New()
|
||||
..()
|
||||
flags_1 |= NOBLUDGEON_1
|
||||
|
||||
/mob/living/silicon/robot
|
||||
var/leaping = 0
|
||||
var/pounce_cooldown = 0
|
||||
var/pounce_cooldown_time = 50 //Nearly doubled, u happy?
|
||||
var/pounce_spoolup = 3
|
||||
var/leap_at
|
||||
var/disabler
|
||||
var/laser
|
||||
var/sleeper_g
|
||||
var/sleeper_r
|
||||
|
||||
#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance.
|
||||
|
||||
/obj/item/dogborg/pounce/afterattack(atom/A, mob/user)
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(R && !R.pounce_cooldown)
|
||||
R.pounce_cooldown = !R.pounce_cooldown
|
||||
to_chat(R, "<span class ='warning'>Your targeting systems lock on to [A]...</span>")
|
||||
addtimer(CALLBACK(R, /mob/living/silicon/robot.proc/leap_at, A), R.pounce_spoolup)
|
||||
spawn(R.pounce_cooldown_time)
|
||||
R.pounce_cooldown = !R.pounce_cooldown
|
||||
else if(R && R.pounce_cooldown)
|
||||
to_chat(R, "<span class='danger'>Your leg actuators are still recharging!</span>")
|
||||
|
||||
/mob/living/silicon/robot/proc/leap_at(atom/A)
|
||||
if(leaping || stat || buckled || lying)
|
||||
return
|
||||
|
||||
if(!has_gravity(src) || !has_gravity(A))
|
||||
to_chat(src,"<span class='danger'>It is unsafe to leap without gravity!</span>")
|
||||
//It's also extremely buggy visually, so it's balance+bugfix
|
||||
return
|
||||
|
||||
if(cell.charge <= 500)
|
||||
to_chat(src,"<span class='danger'>Insufficent reserves for jump actuators!</span>")
|
||||
return
|
||||
|
||||
else
|
||||
leaping = 1
|
||||
weather_immunities += "lava"
|
||||
pixel_y = 10
|
||||
update_icons()
|
||||
throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
|
||||
cell.use(500) //Doubled the energy consumption
|
||||
weather_immunities -= "lava"
|
||||
|
||||
/mob/living/silicon/robot/throw_impact(atom/A)
|
||||
|
||||
if(!leaping)
|
||||
return ..()
|
||||
|
||||
if(A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
var/blocked = 0
|
||||
if(ishuman(A))
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
|
||||
blocked = 1
|
||||
if(!blocked)
|
||||
L.visible_message("<span class ='danger'>[src] pounces on [L]!</span>", "<span class ='userdanger'>[src] pounces on you!</span>")
|
||||
L.Knockdown(45)
|
||||
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
|
||||
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
|
||||
step_towards(src,L)
|
||||
else
|
||||
Knockdown(45, 1, 1)
|
||||
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
spawn(pounce_cooldown_time) //3s by default
|
||||
pounce_cooldown = !pounce_cooldown
|
||||
else if(A.density && !A.CanPass(src))
|
||||
visible_message("<span class ='danger'>[src] smashes into [A]!</span>", "<span class ='userdanger'>You smash into [A]!</span>")
|
||||
playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
|
||||
Knockdown(45, 1, 1)
|
||||
|
||||
if(leaping)
|
||||
leaping = 0
|
||||
pixel_y = initial(pixel_y)
|
||||
update_icons()
|
||||
update_canmove()
|
||||
@@ -0,0 +1,306 @@
|
||||
//Sprites are trademarks of Gamefreak, Nintendo, The Pokemon Company, and Spike Chunsoft.
|
||||
#define ispokemon(A) (istype(A, /mob/living/simple_animal/pokemon))
|
||||
//POKEBALL
|
||||
/obj/item/pokeball
|
||||
name = "pokeball"
|
||||
icon = 'icons/obj/pokeball.dmi'
|
||||
icon_state = "pokeball"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
var/success_chance = 25
|
||||
var/pokemon
|
||||
/obj/item/pokeball/great
|
||||
name = "great ball"
|
||||
icon_state = "pokeball_great"
|
||||
success_chance = 50
|
||||
/obj/item/pokeball/ultra
|
||||
icon_state = "pokeball_ultra"
|
||||
name = "ultra ball"
|
||||
success_chance = 75
|
||||
/obj/item/pokeball/master
|
||||
icon_state = "pokeball_master"
|
||||
name = "master ball"
|
||||
success_chance = 100
|
||||
/* //WIP
|
||||
/obj/item/pokeball/throw_impact(atom/hit_atom)
|
||||
if(ispokemon(hit_atom))
|
||||
var/mob/living/simple_animal/pokemon/pmon = hit_atom
|
||||
var/initial_success_chance = success_chance
|
||||
pmon.resize = 0.1
|
||||
pmon.color = "RED"
|
||||
pmon.canmove = 0
|
||||
sleep(15)
|
||||
if(pmon.pokeball == src)
|
||||
pmon.loc = src
|
||||
pokemon = pmon
|
||||
|
||||
return 1
|
||||
if(pmon.pokeball && pmon.pokeball !=src)
|
||||
return ..()
|
||||
var/bonus_chance = ((pmon.maxHealth - pmon.health) / 2)
|
||||
if(bonus_chance > 100)
|
||||
bonus_chance = 100
|
||||
success_chance = (success_chance + bonus_chance)
|
||||
if(success_chance > 100)
|
||||
success_chance = 100
|
||||
if(success_chance < 0)//just in case
|
||||
success_chance = 0
|
||||
sleep(15)
|
||||
if(prob(success_chance))
|
||||
visible_message("<span class='warning'>[src] shakes...</span>")
|
||||
else
|
||||
escape()
|
||||
sleep(15)
|
||||
if(prob(success_chance))
|
||||
visible_message("<span class='warning'>[src] shakes...</span>")
|
||||
else
|
||||
escape()
|
||||
sleep(15)
|
||||
if(prob(success_chance))
|
||||
visible_message("<span class='warning'>[src] shakes...</span>")
|
||||
else
|
||||
escape()
|
||||
else
|
||||
..()
|
||||
/obj/item/pokeball/proc/capture(mob/living/simple_animal/pokemon/pmon, mob/living/user)
|
||||
|
||||
/obj/item/pokeball/proc/escape(mob/living/simple_animal/pokemon/pmon, mob/living/user)
|
||||
if(!pokemon)
|
||||
return
|
||||
pmon.resize = 10
|
||||
pmon.color = null
|
||||
pmon.canmove = 1
|
||||
pmon.loc = src.loc
|
||||
if(pmon.pokeball != src)
|
||||
visible_message("<span class='warning'>[pmon] breaks free from [src]</span>")
|
||||
PoolOrNew(/obj/effect/particle_effect/sparks, loc)
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
/obj/item/pokeball/proc/recall
|
||||
/obj/item/pokeball/proc/release
|
||||
*/
|
||||
/mob/living/simple_animal/pokemon
|
||||
name = "eevee"
|
||||
icon_state = "eevee"
|
||||
icon_living = "eevee"
|
||||
icon_dead = "eevee_d"
|
||||
desc = "Gotta catch 'em all!"
|
||||
icon = 'icons/mob/pokemon.dmi'
|
||||
var/pokeball
|
||||
pixel_x = -16
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5)
|
||||
ventcrawler = 2
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
layer = 4
|
||||
response_help = "pets"
|
||||
wander = 1
|
||||
turns_per_move = 2
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
|
||||
/mob/living/simple_animal/pokemon/proc/simple_lay_down()
|
||||
set name = "Rest"
|
||||
set category = "IC"
|
||||
|
||||
resting = !resting
|
||||
src << "<span class='notice'>You are now [resting ? "resting" : "getting up"].</span>"
|
||||
update_canmove()
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/pokemon/proc/update_icon()
|
||||
if(lying || resting || sleeping)
|
||||
icon_state = "[icon_state]_rest"
|
||||
else
|
||||
icon_state = "[icon_living]"
|
||||
|
||||
/mob/living/simple_animal/pokemon/New()
|
||||
..()
|
||||
verbs += /mob/living/simple_animal/pokemon/proc/simple_lay_down
|
||||
|
||||
/*
|
||||
/////TEMPLATE/////
|
||||
|
||||
/mob/living/simple_animal/pokemon/
|
||||
name = ""
|
||||
icon_state = ""
|
||||
icon_living = ""
|
||||
icon_dead = ""
|
||||
*/
|
||||
|
||||
/mob/living/simple_animal/pokemon/leg
|
||||
icon = 'icons/mob/legendary.dmi'
|
||||
pixel_x = -32
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 12)
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
|
||||
|
||||
/mob/living/simple_animal/pokemon/leg/articuno
|
||||
name = "Articuno"
|
||||
icon_state = "articuno"
|
||||
icon_living = "articuno"
|
||||
icon_dead = "articuno_d"
|
||||
flying = 1
|
||||
|
||||
/mob/living/simple_animal/pokemon/leg/rayquaza
|
||||
name = "Rayquaza"
|
||||
icon_state = "rayquaza"
|
||||
icon_living = "rayquaza"
|
||||
icon_dead = "rayquaza_d"
|
||||
flying = 1
|
||||
|
||||
//ALPHABETICAL PLEASE
|
||||
|
||||
/mob/living/simple_animal/pokemon/absol
|
||||
name = "absol"
|
||||
icon_state = "absol"
|
||||
icon_living = "absol"
|
||||
icon_dead = "absol_d"
|
||||
speak = list("Absol!", "Ab-Absol!")
|
||||
|
||||
/mob/living/simple_animal/pokemon/aggron
|
||||
name = "aggron"
|
||||
icon_state = "aggron"
|
||||
icon_living = "aggron"
|
||||
icon_dead = "aggron_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/ampharos
|
||||
name = "ampharos"
|
||||
icon_state = "ampharos"
|
||||
icon_living = "ampharos"
|
||||
icon_dead = "ampharos_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/charmander
|
||||
name = "charmander"
|
||||
icon_state = "charmander"
|
||||
icon_living = "charmander"
|
||||
icon_dead = "charmander_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/ditto
|
||||
name = "ditto"
|
||||
icon_state = "ditto"
|
||||
icon_living = "ditto"
|
||||
icon_dead = "ditto_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/dratini/dragonair
|
||||
name = "dragonair"
|
||||
desc = "A Dragonair stores an enormous amount of energy inside its body. It is said to alter the weather around it by loosing energy from the crystals on its neck and tail."
|
||||
icon_state = "dragonair"
|
||||
icon_living = "dragonair"
|
||||
icon_dead = "dragonair_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/dratini/dragonair/dragonite
|
||||
name = "dragonite"
|
||||
desc = "It can circle the globe in just 16 hours. It is a kindhearted Pokémon that leads lost and foundering ships in a storm to the safety of land."
|
||||
icon_state = "dragonite"
|
||||
icon_living = "dragonite"
|
||||
icon_dead = "dragonite_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/dratini
|
||||
name = "dratini"
|
||||
desc = "A Dratini continually molts and sloughs off its old skin. It does so because the life energy within its body steadily builds to reach uncontrollable levels."
|
||||
icon_state = "dratini"
|
||||
icon_living = "dratini"
|
||||
icon_dead = "dratini_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/eevee
|
||||
name = "eevee"
|
||||
desc = "Eevee has an unstable genetic makeup that suddenly mutates due to its environment. Radiation from various stones causes this Pokémon to evolve."
|
||||
icon_state = "eevee"
|
||||
icon_living = "eevee"
|
||||
icon_dead = "eevee_d"
|
||||
speak = list("Eevee!", "Ee-Eevee!")
|
||||
response_help = "pets"
|
||||
response_harm = "hits"
|
||||
|
||||
/mob/living/simple_animal/pokemon/eevee/espeon
|
||||
name = "espeon"
|
||||
desc = "Espeon is extremely loyal to any trainer it considers to be worthy. It is said to have developed precognitive powers to protect its trainer from harm."
|
||||
icon_state = "espeon"
|
||||
icon_living = "espeon"
|
||||
icon_dead = "espeon_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/flaaffy
|
||||
name = "flaaffy"
|
||||
icon_state = "flaaffy"
|
||||
icon_living = "flaaffy"
|
||||
icon_dead = "flaaffy_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/eevee/flareon
|
||||
name = "flareon"
|
||||
desc = "Flareon's fluffy fur releases heat into the air so that its body does not get excessively hot. Its body temperature can rise to a maximum of 1,650 degrees F."
|
||||
icon_state = "flareon"
|
||||
icon_living = "flareon"
|
||||
icon_dead = "flareon_d"
|
||||
speak = list("Flare!", "Flareon!")
|
||||
|
||||
/mob/living/simple_animal/pokemon/eevee/glaceon
|
||||
name = "glaceon"
|
||||
desc = "By controlling its body heat, it can freeze the atmosphere around it to make a diamond-dust flurry."
|
||||
icon_state = "glaceon"
|
||||
icon_living = "glaceon"
|
||||
icon_dead = "glaceon_d"
|
||||
speak = list("Glace!", "Glaceon!")
|
||||
|
||||
/mob/living/simple_animal/pokemon/eevee/jolteon
|
||||
name = "jolteon"
|
||||
desc = "Its cells generate weak power that is amplified by its fur's static electricity to drop thunderbolts. The bristling fur is made of electrically charged needles."
|
||||
icon_state = "jolteon"
|
||||
icon_living = "jolteon"
|
||||
icon_dead = "jolteon_d"
|
||||
speak = list("Jolt!", "Jolteon!")
|
||||
|
||||
/mob/living/simple_animal/pokemon/larvitar
|
||||
name = "larvitar"
|
||||
desc = "It is born deep underground. It can't emerge until it has entirely consumed the soil around it."
|
||||
icon_state = "larvitar"
|
||||
icon_living = "larvitar"
|
||||
icon_dead = "larvitar_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/mareep
|
||||
name = "mareep"
|
||||
icon_state = "mareep"
|
||||
icon_living = "mareep"
|
||||
icon_dead = "mareep_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/poochyena/mightyena
|
||||
name = "mightyena"
|
||||
icon_state = "mightyena"
|
||||
icon_living = "mightyena"
|
||||
icon_dead = "mightyena"
|
||||
|
||||
/mob/living/simple_animal/pokemon/miltank
|
||||
name = "miltank"
|
||||
icon_state = "miltank"
|
||||
icon_living = "miltank"
|
||||
icon_dead = "miltank_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/poochyena
|
||||
name = "poochyena"
|
||||
icon_state = "poochyena"
|
||||
icon_living = "poochyena"
|
||||
icon_dead = "poochyena_d"
|
||||
|
||||
/mob/living/simple_animal/pokemon/eevee/sylveon
|
||||
name = "Sylveon"
|
||||
desc = "Sylveon, the Intertwining Pokémon. Sylveon affectionately wraps its ribbon-like feelers around its Trainer's arm as they walk together."
|
||||
icon_state = "sylveon"
|
||||
icon_living = "sylveon"
|
||||
icon_dead = "sylveon_d"
|
||||
speak = list("Sylveon!", "Syl!")
|
||||
response_help = "pets"
|
||||
response_harm = "hits"
|
||||
|
||||
/mob/living/simple_animal/pokemon/eevee/umbreon
|
||||
name = "umbreon"
|
||||
icon_state = "umbreon"
|
||||
icon_dead = "umbreon_d"
|
||||
icon_living = "umbreon"
|
||||
|
||||
/mob/living/simple_animal/pokemon/vulpix
|
||||
name = "vulpix"
|
||||
icon_state = "vulpix"
|
||||
icon_living = "vulpix"
|
||||
icon_dead = "vulpix_d"
|
||||
Reference in New Issue
Block a user