fix and merge conflicting files

This commit is contained in:
kcin2001
2019-08-25 22:25:15 -07:00
102 changed files with 5391 additions and 2263 deletions
@@ -16,9 +16,9 @@
ai_inactive = TRUE //Always off
show_stat_health = FALSE //We will do it ourselves
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 2
melee_damage_lower = 10
@@ -241,7 +241,7 @@
//Message
blob.visible_message("<b>[src.name]</b> collapses into a gooey blob!")
//Duration of the to_puddle iconstate that the blob starts with
sleep(13)
blob.update_icon() //Will remove the collapse anim
@@ -268,7 +268,7 @@
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
//Stop healing if we are
if(blob.healing)
blob.healing.expire()
@@ -278,7 +278,7 @@
//Message
blob.visible_message("<b>[src.name]</b> reshapes into a humanoid appearance!")
//Duration of above animation
sleep(8)
@@ -303,7 +303,7 @@
var/obj/belly/B = belly
B.forceMove(src)
B.owner = src
//Get rid of friend blob
qdel(blob)
File diff suppressed because it is too large Load Diff
+9 -5
View File
@@ -33,7 +33,10 @@
"Fox" = "fox",
"Parrot" = "parrot",
"Rabbit" = "rabbit",
"Bear" = "bear" //VOREStation Edit
"Bear" = "bear", //VOREStation Edit
"Raccoon" = "raccoon", //Chompstation Edit
"Rat" = "rat", //Chompstation Edit
"Panther" = "panther" //Chompstation Edit
)
var/global/list/possible_say_verbs = list(
@@ -42,7 +45,8 @@
"Beep" = list("beeps","beeps loudly","boops"),
"Chirp" = list("chirps","chirrups","cheeps"),
"Feline" = list("purrs","yowls","meows"),
"Canine" = list("yaps","barks","woofs")
"Canine" = list("yaps","barks","woofs"),
"Rodent" = list("squeaks", "SQUEAKS", "sqiks")//Chompstation Edit
)
var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking
@@ -315,7 +319,7 @@
return
close_up()
/*CHOMPstation edit | redefined in pai_vr.dm
/mob/living/silicon/pai/proc/choose_chassis()
set category = "pAI Commands"
set name = "Choose Chassis"
@@ -328,11 +332,11 @@
if(!choice) return
icon_state = possible_chassis[choice]
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")//CHOMPStation edit
chassis = possible_chassis[choice]
verbs |= /mob/living/proc/hide
*/
/mob/living/silicon/pai/proc/choose_verbs()
set category = "pAI Commands"
set name = "Choose Speech Verbs"
@@ -1,6 +1,10 @@
/mob/living/silicon/pai
var/people_eaten = 0
icon = 'icons/mob/pai_vr.dmi'
var/global/list/wide_chassis = list(
"rat",
"panther"
)
/mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1))
set name = "pAI Nom"
@@ -31,6 +35,13 @@
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
else
icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
/mob/living/silicon/pai/update_icons() //And other functions cause this to occur, such as digesting someone.
..()
update_fullness_pai()
@@ -42,3 +53,21 @@
icon_state = "[chassis]_full"
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
else
icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
//proc override to avoid pAI players being invisible while the chassis selection window is open
/mob/living/silicon/pai/proc/choose_chassis()
set category = "pAI Commands"
set name = "Choose Chassis"
var/choice
choice = input(usr,"What would you like to use for your mobile chassis icon?") as null|anything in possible_chassis
if(!choice) return
chassis = possible_chassis[choice]
verbs |= /mob/living/proc/hide
update_icon()
@@ -421,3 +421,27 @@
T.apply_damage(20, HALLOSS,, armor_block, armor_soak)
if(prob(33))
T.apply_effect(3, WEAKEN, armor_block)
/mob/living/silicon/robot/proc/reskin_booze()
set name = "Change Drink Color"
set category = "Robot Commands"
set desc = "Choose the color of drink displayed inside you."
var/mob/M = usr
var/list/options = list()
options["Beer"] = "Beer Buddy"
options["Curacao"] = "Brilliant Blue"
options["Coffee"] = "Caffine Dispenser"
options["Space Mountain Wind"] = "Gamer Juice Maker"
options["Whiskey Soda"] = "Liqour Licker"
options["Grape Soda"] = "The Grapist"
options["Demon's Blood"] = "Vampire's Aid"
options["Slav Vodka"] = "Vodka Komrade"
var/choice = input(M,"Choose your drink!") in options
if(src && choice && !M.stat && in_range(M,src))
icontype = options[choice]
var/active_sound = 'sound/effects/bubbles.ogg'
playsound(src.loc, "[active_sound]", 100, 0, 4)
M << "Your Tank now displays [choice]. Drink up and enjoy!"
updateicon()
return 1
@@ -683,4 +683,34 @@
/obj/item/device/dogborg/sleeper/medical
name = "Borg Mounted Sleeper"
desc = "A stretchy stomach for a vore enabled medical borg, it can hold crew for healing or as emergency power."
icon_state = "belly-medical"
icon_state = "belly-medical"
/obj/item/device/dogborg/sleeper/compactor/brewer //Boozehound gut.
name = "Brew Belly"
desc = "A mounted drunk tank unit with fuel processor."
icon_state = "brewer"
injection_chems = list("vodka","beer","gin") //Injected alcohol is 3 times as strong
max_item_count = 1
/obj/item/device/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem)
if(patient && patient.reagents)
if(chem in injection_chems + "inaprovaline")
if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it.
to_chat(hound, "<span class='notice'>You don't have enough power to synthesize fluids.</span>")
return
else if(patient.reagents.get_reagent_amount(chem) + 10 >= 50) //Preventing people from accidentally killing themselves by trying to inject too many chemicals!
to_chat(hound, "<span class='notice'>Your stomach is currently too full of fluids to secrete more fluids of this kind.</span>")
else if(patient.reagents.get_reagent_amount(chem) + 10 <= 50) //No overdoses for you
patient.reagents.add_reagent(chem, inject_amount)
drain(100) //-100 charge per injection
var/units = round(patient.reagents.get_reagent_amount(chem))
to_chat(hound, "<span class='notice'>Injecting [units] unit\s of [chemical_reagents_list[chem]] into occupant.</span>") //If they were immersed, the reagents wouldn't leave with them.
// PLACEHOLDER SERVICE BORG BELLY
/obj/item/device/dogborg/sleeper/servborg
name = "Gourmet Gut"
desc = "An underslung microwave, with optional fuel processor."
icon_state = "decompiler"
max_item_count = 10
injection_chems = null
@@ -43,6 +43,8 @@
robot_modules["Janihound"] = /obj/item/weapon/robot_module/robot/scrubpup
robot_modules["Sci-borg"] = /obj/item/weapon/robot_module/robot/science
robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engiedog
robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze
robot_modules["Service-borg"] = /obj/item/weapon/robot_module/robot/servborg
robot_modules["Vore Services"] = /obj/item/weapon/robot_module/robot/servore//edit chompers
robot_modules["Medivore"] = /obj/item/weapon/robot_module/robot/medical/vore
return 1
@@ -445,6 +447,105 @@
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/booze
name = "BoozeHound robot module"
channels = list("Service" = 1)
languages = list(
LANGUAGE_SOL_COMMON = 1,
LANGUAGE_UNATHI = 1,
LANGUAGE_SIIK = 1,
LANGUAGE_AKHANI = 1,
LANGUAGE_SKRELLIAN = 1,
LANGUAGE_SKRELLIANFAR = 0,
LANGUAGE_ROOTLOCAL = 0,
LANGUAGE_TRADEBAND = 1,
LANGUAGE_GUTTER = 0,
LANGUAGE_SCHECHI = 1,
LANGUAGE_EAL = 1,
LANGUAGE_TERMINUS = 1,
LANGUAGE_SIGN = 0
)
/obj/item/weapon/robot_module/robot/booze
sprites = list(
"Beer Buddy" = "boozeborg",
"Brilliant Blue" = "boozeborg(blue)",
"Caffine Dispenser" = "boozeborg(coffee)",
"Gamer Juice Maker" = "boozeborg(green)",
"Liqour Licker" = "boozeborg(orange)",
"The Grapist" = "boozeborg(purple)",
"Vampire's Aid" = "boozeborg(red)",
"Vodka Komrade" = "boozeborg(vodka)"
)
/obj/item/weapon/robot_module/robot/booze/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/gripper/service(src)
//src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
//src.modules += new /obj/item/weapon/material/minihoe(src)
//src.modules += new /obj/item/device/analyzer/plant_analyzer(src)
//src.modules += new /obj/item/weapon/storage/bag/plants(src)
//src.modules += new /obj/item/weapon/robot_harvester(src)
src.modules += new /obj/item/weapon/material/knife(src)
src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src)
src.modules += new /obj/item/device/multitool(src) //to freeze trays
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/device/dogborg/sleeper/compactor/brewer(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the ALCOHOL
src.emag = new /obj/item/weapon/dogborg/pounce(src)
R.verbs += /mob/living/silicon/robot/proc/reskin_booze
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.stored_matter = 30
src.modules += M
src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src)
var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src)
L.lit = 1
src.modules += L
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0.1 // Recharging water for plants - hehe drooly borg
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
src.modules += new /obj/item/weapon/tray/robotray(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service/booze(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
var/datum/reagents/N = new/datum/reagents(50)
src.emag.reagents = N
N.my_atom = src.emag
N.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
R.can_buckle = 1
R.icon = 'icons/mob/widerobot_colors_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/booze/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
E.reagents.add_reagent("enzyme", 2 * amount)
if(src.emag)
var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag
B.reagents.add_reagent("beer2", 2 * amount)
/obj/item/weapon/robot_module/robot/engiedog
name = "Construction Hound module"
can_buckle = 1
@@ -569,6 +670,83 @@
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
// SKYVAAL ADDED SERVICE BORG CODE
/obj/item/weapon/robot_module/robot/servborg
name = "Service Hound Module"
can_buckle = 1
sprites = list(
"Chef-borg" = "servborg",
"Booze-borg" = "boozeborg"
)
channels = list("Service" = 1)
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/servborg/New(var/mob/living/silicon/robot/R)
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0.1 // Recharging water for plants - hehe drooly borg
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
// Dogborg Standard
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
// PLACEHOLDER AS 'BRIGBELLY' UNTIL MICROWAVE BELLY SORTED
var/obj/item/device/dogborg/sleeper/servborg/B = new /obj/item/device/dogborg/sleeper/servborg(src)
B.water = water
src.modules += B
//Service Module Copy/Paste
src.modules += new /obj/item/weapon/gripper/service(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
src.modules += new /obj/item/weapon/material/minihoe(src)
src.modules += new /obj/item/weapon/material/knife/machete/hatchet(src)
src.modules += new /obj/item/device/analyzer/plant_analyzer(src)
src.modules += new /obj/item/weapon/storage/bag/plants(src)
src.modules += new /obj/item/weapon/robot_harvester(src)
src.modules += new /obj/item/weapon/material/knife(src)
src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src)
src.modules += new /obj/item/device/multitool(src) //to freeze trays
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.stored_matter = 30
src.modules += M
src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src)
var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src)
L.lit = 1
src.modules += L
src.modules += new /obj/item/weapon/tray/robotray(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
var/datum/reagents/F = new/datum/reagents(50)
src.emag.reagents = F
F.my_atom = src.emag
F.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/Reset(var/mob/living/silicon/robot/R)
R.pixel_x = initial(pixel_x)
R.pixel_y = initial(pixel_y)
@@ -23,28 +23,12 @@
var/zerg_types = list("Zerg Drone" = /mob/living/simple_animal/hostile/hivebot/zerg/worker,)
isSynthetic()
return FALSE
/mob/living/simple_animal/hostile/hivebot/zerg/isSynthetic()
return FALSE
/mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve()
//TODDO MAke this work nicely
set name = "EVOLVE"
set desc = "Performs larva evolution."
set category = "Abilities"
var/location = get_turf(src)
chosentype = input(usr,"What type would you like to be?") as null|anything in zerg_types
if(!chosentype) return
if(!src.ckey)
death()
qdel(src)
new /mob/living/simple_animal/hostile/hivebot/zerg/worker(location)
else
var/myuser = src.key
death()
qdel(src)
var/mob/living/simple_animal/hostile/newmob = new chosentype(location)
newmob.ckey = myuser
/////////////////////////////////////////////////////////////////
///////////////////// LARVA "CORE" //////////////////////////////
/////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/hivebot/zerg/larva
name = "zerg larva"
@@ -54,17 +38,45 @@
maxHealth = 0.2 LASERS_TO_KILL
health = 0.2 LASERS_TO_KILL
var/chosentype = null
/mob/living/simple_animal/hostile/hivebot/zerg/larva/Life()
..()
/mob/living/simple_animal/hostile/hivebot/zerg/larva/New()
..()
verbs |= /mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve
/mob/living/simple_animal/hostile/hivebot/zerg/larva/initialize()
spawn(1200)
if(!src.ckey)
evolve()
Life()
..()
New()
..()
verbs |= /mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve
initialize()
..()
spawn(1200)
if(!src.client)
evolve()
/////////////////////////////////////////////////////////////////
///////////////////// EVOLUTION /////////////////////////////////
/////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve()
//TODDO MAke this work nicely
set name = "EVOLVE"
set desc = "Performs larva evolution."
set category = "Abilities"
var/location = get_turf(src)
chosentype = input(usr,"What type would you like to be?") as null|anything in zerg_types
if(!chosentype && src.ckey) return
if(!src.client)
qdel(src)
new /mob/living/simple_animal/hostile/hivebot/zerg/worker(location)
else
var/myuser = src.key
var/mob/living/simple_animal/hostile/newmob = chosentype
death()
qdel(src)
newmob.ckey = myuser
new newmob(location)
/////////////////////////////////////////////////////////////////
///////////////////// ZERG TYPES ////////////////////////////////
/////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/hivebot/zerg/worker
name = "Zerg Drone"
desc = "Drones are fundamental to economic and tech development, as they harvest resources and construct buildings."
@@ -72,3 +84,17 @@
health = 1 LASERS_TO_KILL
melee_damage_lower = 1
melee_damage_upper = 1
/mob/living/simple_animal/hostile/hivebot/zerg/broodsack
name = "Zerg Brood"
desc = "Brood sacks are living creatures who's sole purpose it is to incubate larva."
maxHealth = 1
health = 1
melee_damage_lower = 0
melee_damage_upper = 0
Life()
sleep(3000)
new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc)
new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc)
new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc)
@@ -16,9 +16,9 @@
turns_per_move = 3
speed = 4
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 10
@@ -15,9 +15,9 @@
speed = 4
turns_per_move = 5
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 8
melee_damage_lower = 15
@@ -46,7 +46,7 @@
desc = "It's Coffee, the other pet!"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
response_harm = "stomps on"
//Sif Crabs
/mob/living/simple_animal/giant_crab
@@ -78,18 +78,18 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
response_harm = "kicks"
friendly = "pinches"
speak_chance = 1
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
//Enemy version.
/mob/living/simple_animal/hostile/giant_crab
/mob/living/simple_animal/hostile/giant_crab
name = "giant crab"
desc = "A giant enemy crab."
tt_desc = "S Cancer holligus"
@@ -116,7 +116,7 @@
attack_sharp = 1
attack_edge = 1
armor = list(
armor = list(
"melee" = 40,
"bullet" = 10,
"laser" = 25,
@@ -128,7 +128,7 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
response_harm = "kicks"
friendly = "pinches"
speak_chance = 1
@@ -1,5 +1,5 @@
/mob/living/simple_animal/deer
name = "Deer"
name = "deer"
desc = "An animal with impressive antlers and skittish personality, though this one seems domesticated."
tt_desc = "Cervus elaphus"
icon_state = "Deer"
@@ -50,7 +50,7 @@
response_help = "pets"
response_disarm = "barely manage to push aside"
response_harm = "nibbles"
response_harm = "hits"
attacktext = list("nibbled")
speak_chance = 20
@@ -83,6 +83,7 @@ Nurse Family
poison_type = "spidertoxin" // VOREStation edit, original is stoxin. (sleep toxins)
var/fed = 0
var/fedsmall = 0
var/atom/cocoon_target
var/egg_inject_chance = 5
@@ -518,7 +519,7 @@ Spider Procs
else
//third, lay an egg cluster there
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
if(!E && fed > 0)
if(!E && fed > 0 || fedsmall > 0)
busy = LAYING_EGGS
src.visible_message("<span class='notice'>\The [src] begins to lay a cluster of eggs.</span>")
stop_automated_movement = 1
@@ -526,8 +527,12 @@ Spider Procs
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
new /obj/effect/spider/eggcluster(loc, src)
fed--
if(fed >= 1)
new /obj/effect/spider/eggcluster(loc, src)
fed--
if(fedsmall >= 1)
new /obj/effect/spider/eggcluster/small(loc, src)
fedsmall--
busy = 0
stop_automated_movement = 0
else
@@ -562,7 +567,10 @@ Spider Procs
if(istype(M, /mob/living/simple_animal/hostile/giant_spider))
continue
large_cocoon = 1
fed++
if(istiny(cocoon_target))
fedsmall++
if(!istiny(cocoon_target))
fed++
src.visible_message("<span class='warning'>\The [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.</span>")
M.forceMove(C)
C.pixel_x = M.pixel_x
@@ -15,9 +15,9 @@
turns_per_move = 5
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5 //they're meant to be annoying, not threatening.
@@ -1,5 +1,5 @@
/mob/living/simple_animal/lizard
name = "Lizard"
name = "lizard"
desc = "A cute tiny lizard."
faction = "lizard"
tt_desc = "E Anolis cuvieri"
@@ -25,11 +25,11 @@
speak_emote = list("hisses")
var/amount_grown = 0
/mob/living/simple_animal/lizard/event
desc = "This one looks like it is growing huge!"
/mob/living/simple_animal/lizard/event/Life()
. = ..()
if(amount_grown >= 0)
@@ -43,7 +43,7 @@
if(prob(99.999))
new /mob/living/simple_animal/hostile/lizardman(get_turf(src))
qdel(src)
else
else
new /mob/living/simple_animal/hostile/deathclaw(get_turf(src))
qdel(src)
@@ -0,0 +1,63 @@
//raccoon
/mob/living/simple_animal/raccoon
name = "raccoon"
desc = "A raccoon, also known as a trash panda."
tt_desc = "E purgamentum raccoonus"
intelligence_level = SA_ANIMAL
icon = 'icons/mob/animal_vr.dmi'
icon_state = "raccoon"
item_state = "raccoon"
icon_living = "raccoon"
icon_dead = "raccoon_dead"
investigates = 1
specific_targets = 1 //Only targets with Found()
run_at_them = 0 //DOMESTICATED
view_range = 5
turns_per_move = 5
see_in_dark = 6
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
min_oxy = 16 //Require atleast 16kPA oxygen
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
speak_chance = 1
speak = list("HSSSSS")
speak_emote = list("purrs")
emote_see = list("shakes their head", "shivers","grooms self", "nibbles on some trash")
say_maybe_target = list("Hss?")
say_got_target = list("HSSSS!","REEER!")
meat_amount = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/turns_since_scan = 0
var/mob/flee_target
/mob/living/simple_animal/raccoon/proc/handle_flee_target()
//see if we should stop fleeing
if (flee_target && !(flee_target in ListTargets(view_range)))
flee_target = null
GiveUpMoving()
if (flee_target && !stat && !buckled)
if (resting)
lay_down()
if(prob(25)) say("HSSSSS")
stop_automated_movement = 1
walk_away(src, flee_target, 7, 2)
/mob/living/simple_animal/raccoon/react_to_attack(var/atom/A)
if(A == src) return
flee_target = A
turns_since_scan = 5
/mob/living/simple_animal/raccoon/ex_act()
. = ..()
react_to_attack(src.loc)
@@ -9,9 +9,9 @@
icon_dead = "sculpture"
emote_hear = list("makes a faint scraping sound")
emote_see = list("twitches slightly", "shivers")
response_help = "touches the"
response_disarm = "pushes the"
response_harm = "hits the"
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
see_in_dark = 8 //Needs to see in darkness to snap in darkness
pass_flags = PASSTABLE
var/response_snap = "snapped the neck of" //Past tense because it "happened before you could see it"
@@ -20,6 +20,7 @@
var/transformed = FALSE
var/memorysize = 50 //Var for how many messages synxes remember if they know speechcode
var/list/voices = list()
var/forcefeedchance = 20
faction = "Synx"
intelligence_level = SA_ANIMAL
@@ -40,8 +41,8 @@
"rad" = 100)
has_hands = 1
response_help = "pets"
response_disarm = "gently pushes aside"
response_help = "pets the"
response_disarm = "gently pushes aside the"
pass_flags = PASSTABLE
@@ -182,7 +183,7 @@ mob/living/simple_animal/synx/PunchTarget()
metabolism = REM * 1 //ten times faster for convenience of testers.
color = "#00FFFF"
overdose = REAGENTS_OVERDOSE * 20 //it's all fake. But having nanomachines move through you is not good at a certain amount.
/datum/reagent/inaprovaline/synxchem/holo/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien != IS_DIONA)
if(prob(5))
@@ -230,8 +231,8 @@ mob/living/simple_animal/synx/PunchTarget()
M.adjustHalLoss(1) //dealing 5 times the amount of brute healed as halo, but we cant feel pain yet
// ^ I have no idea what this might cause, my ideal plan is that once the pain killer wears off you suddenly collapse;
//Since Halloss is not "real" damage this should not cause death
/datum/reagent/inaprovaline/synxchem/overdose(var/mob/living/carbon/M, var/alien, var/removed)
..()
if(alien != IS_DIONA)
@@ -242,7 +243,7 @@ mob/living/simple_animal/synx/PunchTarget()
M.AdjustStunned(1)
if(prob(2))
M.AdjustParalysis(1)
/datum/reagent/inaprovaline/synxchem/holo/overdose(var/mob/living/carbon/M, var/alien, var/removed)
return
@@ -257,7 +258,7 @@ mob/living/simple_animal/synx/PunchTarget()
if(.) // If we succeeded in hitting.
if(isliving(A))
var/mob/living/L = A
if(prob(20))//Forcefeeding code
if(prob(forcefeedchance))//Forcefeeding code
L.Weaken(5)
stop_automated_movement = 1
src.feed_self_to_grabbed(src,L)
@@ -274,6 +275,7 @@ mob/living/simple_animal/synx/PunchTarget()
/mob/living/simple_animal/retaliate/synx/hear_say(message,verb,language,fakename,isItalics,var/mob/living/speaker)
. = ..()
if(!message) return
if (speaker == src) return
speaker = speaker.GetVoice()
speak += message
voices += speaker
@@ -298,7 +300,7 @@ mob/living/simple_animal/synx/PunchTarget()
/mob/living/simple_animal/retaliate/synx/handle_idle_speaking()
if(voices && prob(speak_chance/2))
randomspeech()
//////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////// POWERS!!!! /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
@@ -349,7 +351,7 @@ mob/living/simple_animal/synx/PunchTarget()
set category = "Abilities"
if(speak && voices)
handle_mimic()
else
else
usr << "<span class='warning'>YOU NEED TO HEAR THINGS FIRST, try using Ventcrawl to eevesdrop on nerds</span>"
/mob/living/simple_animal/retaliate/synx/proc/handle_mimic()
@@ -370,14 +372,14 @@ mob/living/simple_animal/synx/PunchTarget()
glow_range = 4
glow_toggle = 1
player_msg = "You aren't supposed to be in this. Wrong mob."
/mob/living/simple_animal/retaliate/synx/pet/init_vore()
..()
var/obj/belly/B = vore_selected
B.vore_verb = "swallow"
B.digest_burn = 1
B.digest_brute = 0
/mob/living/simple_animal/retaliate/synx/pet/holo/init_vore()
..()
var/obj/belly/B = vore_selected
@@ -408,7 +410,7 @@ mob/living/simple_animal/synx/PunchTarget()
var/location = get_turf(src)
new /obj/item/seeds/hardlightseed/typesx(location)
qdel(src)
/mob/living/simple_animal/retaliate/synx/pet/holo/gib()
visible_message("<span class='notice'>\The [src] fades away!</span>")
var/location = get_turf(src)
@@ -469,7 +471,7 @@ mob/living/simple_animal/synx/PunchTarget()
icon_state = "synx_diablo_living"
icon_living = "synx_diablo_living"
icon_dead = "synx_diablo_dead"
speak = list( )
speak = list( )
//Vore Section
vore_capacity = 2
@@ -479,7 +481,7 @@ mob/living/simple_animal/synx/PunchTarget()
icon_state = "synx_diablo_living"
icon_living = "synx_diablo_living"
icon_dead = "synx_diablo_dead"
speak = list( )
speak = list( )
//Vore Section
vore_capacity = 2
@@ -502,7 +504,7 @@ mob/living/simple_animal/synx/PunchTarget()
//Vore Section
vore_default_mode = DM_HEAL
vore_capacity = 10
vore_digest_chance = 0
vore_digest_chance = 0
vore_pounce_chance = 1 //MAKE THEM HONK
vore_bump_chance = 0 //lowered bump chance
vore_escape_chance = 100
@@ -549,3 +551,80 @@ mob/living/simple_animal/synx/PunchTarget()
else return pick(prob(50);/mob/living/simple_animal/retaliate/synx/pet/greed,
prob(50);/mob/living/simple_animal/retaliate/synx/pet/diablo,
prob(50);/mob/living/simple_animal/retaliate/synx/pet/holo,)
////////////////////////////////////////////////////////////////////////////
//////////////////////////NOT A SYNX///////but looks kinda like one/////////
////////////////////////////////////////////////////////////////////////////
//So we got base synxes pretty much done, how about some special variants
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers
name = "Synx?"
desc = "A cold blooded, genderless, parasitic eel? Is it crying?"
tt_desc = "Synxus?"
forcefeedchance = 99 //You have a stomach? yeah they go in.
poison_per_bite = 0 //no poison
hostile = 1
faction = "synx?"
melee_damage_lower = 1
melee_damage_upper = 1
environment_smash = 1
destroy_surroundings = 1
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/New()
..()
faction = rand(1,5)
switch(faction)
if(1 , 2)
voices |= "Unidentifiable Weeping"
name = "Weeper"
melee_damage_upper = 4
if(3)
voices |= "Radio Static"
name = "Whistler"
melee_damage_upper = 20
if(4 , 5)
voices |= "Unidentifiable Wailing"
name= "Wailer"
melee_damage_upper = 10
speak |= "No one"
voices -= "Garbled voice"
voices -= "Unidentifiable Voice"
speak -= "Who is there?"
speak -= "What is that thing?!"
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/MoveToTarget()
var/mob/living/speaker
if(target_mob)
speaker = target_mob
speak |= speaker.GetVoice()
..()
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/Life()
..()
if(prob(1) && faction <= 5)
handlemutations(rand(1,5))
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/proc/handlemutations(faction)
switch(faction)
if(1 , 2 , 11 , 12)
voices = "Unidentifiable Weeping"
name = "Weeper"
melee_damage_upper = 4
if(3 , 13)
voices = "Radio Static"
name = "Whistler"
melee_damage_upper = 20
if(4 , 5 , 14 , 15)
voices = "Unidentifiable Wailing"
name= "Wailer"
melee_damage_upper = 10
if(6 to 10 , 16 to 20)
voices = "Breathing"
name= "Silent"
else return
//WEEPING END
@@ -1,215 +1,226 @@
/mob/living/simple_animal/hostile/tomato
name = "tomato"
desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
tt_desc = "X Solanum abominable"
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
intelligence_level = SA_PLANT
faction = "plants"
maxHealth = 15
health = 15
turns_per_move = 5
response_help = "prods"
response_disarm = "pushes aside"
response_harm = "smacks"
harm_intent_damage = 5
melee_damage_upper = 15
melee_damage_lower = 10
attacktext = list("mauled")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
//CHOMPEDIT PIRANHA PLANT.
//When I stop being lazy I'll give this its own file -shark
//Yes I'm basing this shit on the tomato, sue me. -shark
//No longer based on tomato because evolved too far -shark
/mob/living/simple_animal/hostile/piranhaplant
name = "Piranha Plant"
desc = "It's a plant, that eats people!"
tt_desc = "Packun Flower"
faction = "plants"
intelligence_level = SA_PLANT
maxHealth = 50
health = 50
meat_type = null
//Mob icon/appearance settings
icon = 'icons/mob/plantmobs32x32.dmi' //Thanks to vorebound mod and Estelle
icon_living = "piranha-plant"
icon_state = "piranha-plant"
icon_dead = "piranha-plant_dead"
icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation.
//icon_rest = null // The iconstate for resting, optional
attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim
attack_icon_state = "slash" //Just the default //gonna have to make teeth chomping version
//Vore stuff
vore_active = 1
vore_capacity = 1
vore_pounce_chance = 10
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DIGEST
vore_digest_chance = 99
vore_absorb_chance = 0
vore_escape_chance = 5
vore_icons = SA_ICON_LIVING
swallowTime = 10 SECONDS //CHOMPED
//Movement Stuff
wander = 0 // Does the mob wander around when idle?
wander_distance = 0 // How far the mob will wander before going home (assuming they are allowed to do that)
returns_home = 1 // Mob knows how to return to wherever it started
turns_per_move = 4 // How many life() cycles to wait between each wander mov?
stop_when_pulled = 0 // When set to 1 this stops the animal from moving when someone is pulling it.
follow_dist = 0 // Distance the mob tries to follow a friend
speed = 4 // Higher speed is slower, negative speed is faster.
//Talk/Emote stuff
speak_chance = 0 // Probability that I talk (this is 'X in 200' chance since even 1/100 is pretty noisy)
reacts = 1 // Reacts to some things being said
speak = list() // Things I might say if I talk
emote_hear = list("chomps","snaps at the air") // Hearable emotes I might perform
emote_see = list() // Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
say_understood = list() // List of things to say when accepting an order
say_cannot = list() // List of things to say when they cannot comply
say_maybe_target = list() // List of things to say when they spot something barely
say_got_target = list() // List of things to say when they engage a target
reactions = list("chomp" = "!chomps",) // List of "string" = "reaction" and things they hear will be searched for string.
//Hostility war bloodshed, RAWR
hostile = 1 // Do I even attack?
view_range = 2 // Scan for targets in this range.
investigates = 1 // Do I investigate if I saw someone briefly?
cooperative = 1 // Do I ask allies to help me?
assist_distance = 2 // Radius in which I'll ask my comrades for help.
grab_resist = 100 // Chance of me resisting a grab attempt.
taser_kill = 1 // Is the mob weak to tasers
//Melee behaviour
melee_damage_lower = 1 // Lower bound of randomized melee damage
melee_damage_upper = 25 // Upper bound of randomized melee damage
attacktext = list("chomped","bit","hompfed","crunched","cronched") // "You are [attacktext] by the mob!"
friendly = list("nuzzles") // "The mob [friendly] the person."
//attack_sound = null // Sound to play when I attack
environment_smash = 0 // How much environment damage do I do when I hit stuff?
melee_miss_chance = 1 // percent chance to miss a melee attack.
melee_attack_minDelay = 5 // How long between attacks at least
melee_attack_maxDelay = 20 // How long between attacks at most
attack_armor_type = "bio" // What armor does this check?
attack_armor_pen = 50 // How much armor pen this attack has.
attack_sharp = 1 // Is the attack sharp?
attack_edge = 0 // Does the attack have an edge?
//Stuff for people wanting to be a fucking plant. Weirdos
show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
ai_inactive = 0 // Set to 1 to turn off most AI actions
has_hands = 1 // Set to 1 to enable the use of hands and the hands hud
humanoid_hands = 1 // Can a player in this mob use things like guns or AI cards?
//hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'.
//hud_gears // Slots to show on the hud (typically none)
//ui_icons // Icon file path to use for the HUD, otherwise generic icons are used
//r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this
//l_hand_sprite = "piranha_l" // they could use some icons.
player_msg = "PLANT GO CHOMP" // Message to print to players about 'how' to play this mob on login.
//Ranged variation
/mob/living/simple_animal/hostile/piranhaplant/spitter
//might snatch the code for that uranium ray for this since it should poison
name = "Piranha Spitter"
attack_armor_pen = 0
//Attack ranged settings.
ranged = 1 // Do I attack at range?
shoot_range = 6 // How far away do I start shooting from?
view_range = 5 //More range, more hurt, more... plant?
rapid = 1 // Three-round-burst fire mode
firing_lines = 0 // Avoids shooting allies
projectiletype = /obj/item/projectile/energy/piranhaspit // The projectiles I shoot
projectilesound = 'sound/weapons/thudswoosh.ogg' // The sound I make when I do it
casingtype = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha // What to make the hugely laggy casings pile out of
//Piranha unique projectile
/obj/item/projectile/energy/piranhaspit
name = "piranhaspit"
icon_state = "neurotoxin"
damage = 4 //Reduced damage to 4 from 10, 3 fired projectiles mean might do 12 total if all 3 hit
damage_type = TOX
check_armour = "bio" //yup biohazard protection works here
flash_strength = 0
agony = 10
combustion = FALSE
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha
name = "Soylent"
desc = "This was spat out by a strange plant that eats people."
icon_state = "soylent_green"
filling_color = "#B8E6B5"
center_of_mass = list("x"=15, "y"=11)
/obj/item/projectile/energy/piranhaspit/on_hit(var/atom/soyled)
soyl(soyled)
..()
/obj/item/projectile/energy/piranhaspit/proc/soyl(var/mob/M)
var/location = get_turf(M)
new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(location)
//VORE FLUFF section and extended gut settings
/mob/living/simple_animal/hostile/piranhaplant/init_vore()
..()
var/obj/belly/B = vore_selected
B.vore_verb = "chomp up"
B.name = "stomach"
B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..."
B.digest_burn = 0
B.digest_brute = 12
/mob/living/simple_animal/hostile/piranhaplant/pitcher
icon_state = "pitcher"
icon_living = "pitcher"
name = "Pitcher Plant"
desc = "It's a plant! How pretty"
tt_desc = "Brig Flower"
health = 50
maxHealth = 50 //starts with 50
var/antispam = 0
/mob/living/simple_animal/hostile/piranhaplant/pitcher/death()
..()
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
qdel(src)
/mob/living/simple_animal/hostile/piranhaplant/pitcher/Life()
..()
if(!anchored)
anchored=1
if(maxHealth <= 499) //Ok maybe there are limits
maxHealth = health //Limits are merely a suggestion
if(vore_fullness && !antispam)
antispam = 1
spawn(10)
if(maxHealth <= 499)
maxHealth += 1
health += 1
antispam = !antispam
if(size_multiplier!=1*health/100)
size_multiplier=1*health/100
update_icons()
/mob/living/simple_animal/hostile/piranhaplant/pitcher/init_vore()
..()
var/obj/belly/B = vore_selected
B.digest_burn = 0.5
B.digest_brute = 0
B.vore_verb = "slurped up"
B.name = "pitcher"
/mob/living/simple_animal/hostile/tomato
name = "tomato"
desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
tt_desc = "X Solanum abominable"
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
intelligence_level = SA_PLANT
faction = "plants"
maxHealth = 15
health = 15
turns_per_move = 5
response_help = "prods"
response_disarm = "pushes aside"
response_harm = "smacks"
harm_intent_damage = 5
melee_damage_upper = 15
melee_damage_lower = 10
attacktext = list("mauled")
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
//CHOMPEDIT PIRANHA PLANT.
//When I stop being lazy I'll give this its own file -shark
//Yes I'm basing this shit on the tomato, sue me. -shark
//No longer based on tomato because evolved too far -shark
/mob/living/simple_animal/hostile/piranhaplant
name = "Piranha Plant"
desc = "It's a plant, that eats people!"
tt_desc = "Packun Flower"
faction = "plants"
intelligence_level = SA_PLANT
maxHealth = 50
health = 50
meat_type = null
//Mob icon/appearance settings
icon = 'icons/mob/plantmobs32x32.dmi' //Thanks to vorebound mod and Estelle
icon_living = "piranha-plant"
icon_state = "piranha-plant"
icon_dead = "piranha-plant_dead"
icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation.
//icon_rest = null // The iconstate for resting, optional
attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim
attack_icon_state = "slash" //Just the default //gonna have to make teeth chomping version
//Vore stuff
vore_active = 1
vore_capacity = 1
vore_pounce_chance = 10
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DIGEST
vore_digest_chance = 99
vore_absorb_chance = 0
vore_escape_chance = 5
vore_icons = SA_ICON_LIVING
swallowTime = 10 SECONDS //CHOMPED
//Movement Stuff
wander = 0 // Does the mob wander around when idle?
wander_distance = 0 // How far the mob will wander before going home (assuming they are allowed to do that)
returns_home = 1 // Mob knows how to return to wherever it started
turns_per_move = 4 // How many life() cycles to wait between each wander mov?
stop_when_pulled = 0 // When set to 1 this stops the animal from moving when someone is pulling it.
follow_dist = 0 // Distance the mob tries to follow a friend
speed = 4 // Higher speed is slower, negative speed is faster.
entangle_immunity = 1 //makes mob immune to entangle effect of vines and also wont get stabbed by vines that has thorns
//Talk/Emote stuff
speak_chance = 0 // Probability that I talk (this is 'X in 200' chance since even 1/100 is pretty noisy)
reacts = 1 // Reacts to some things being said
speak = list() // Things I might say if I talk
emote_hear = list("chomps","snaps at the air") // Hearable emotes I might perform
emote_see = list() // Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
say_understood = list() // List of things to say when accepting an order
say_cannot = list() // List of things to say when they cannot comply
say_maybe_target = list() // List of things to say when they spot something barely
say_got_target = list() // List of things to say when they engage a target
reactions = list("chomp" = "!chomps",) // List of "string" = "reaction" and things they hear will be searched for string.
//Hostility war bloodshed, RAWR
hostile = 1 // Do I even attack?
view_range = 2 // Scan for targets in this range.
investigates = 1 // Do I investigate if I saw someone briefly?
cooperative = 1 // Do I ask allies to help me?
assist_distance = 2 // Radius in which I'll ask my comrades for help.
grab_resist = 100 // Chance of me resisting a grab attempt.
taser_kill = 1 // Is the mob weak to tasers
//Melee behaviour
melee_damage_lower = 1 // Lower bound of randomized melee damage
melee_damage_upper = 25 // Upper bound of randomized melee damage
attacktext = list("chomped","bit","hompfed","crunched","cronched") // "You are [attacktext] by the mob!"
friendly = list("nuzzles") // "The mob [friendly] the person."
//attack_sound = null // Sound to play when I attack
environment_smash = 0 // How much environment damage do I do when I hit stuff?
melee_miss_chance = 1 // percent chance to miss a melee attack.
melee_attack_minDelay = 5 // How long between attacks at least
melee_attack_maxDelay = 20 // How long between attacks at most
attack_armor_type = "bio" // What armor does this check?
attack_armor_pen = 50 // How much armor pen this attack has.
attack_sharp = 1 // Is the attack sharp?
attack_edge = 0 // Does the attack have an edge?
//Stuff for people wanting to be a fucking plant. Weirdos
show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
ai_inactive = 0 // Set to 1 to turn off most AI actions
has_hands = 1 // Set to 1 to enable the use of hands and the hands hud
humanoid_hands = 1 // Can a player in this mob use things like guns or AI cards?
//hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'.
//hud_gears // Slots to show on the hud (typically none)
//ui_icons // Icon file path to use for the HUD, otherwise generic icons are used
//r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this
//l_hand_sprite = "piranha_l" // they could use some icons.
player_msg = "PLANT GO CHOMP" // Message to print to players about 'how' to play this mob on login.
//Ranged variation
/mob/living/simple_animal/hostile/piranhaplant/spitter
//might snatch the code for that uranium ray for this since it should poison
name = "Piranha Spitter"
attack_armor_pen = 0
//Attack ranged settings.
ranged = 1 // Do I attack at range?
shoot_range = 6 // How far away do I start shooting from?
view_range = 5 //More range, more hurt, more... plant?
rapid = 1 // Three-round-burst fire mode
firing_lines = 0 // Avoids shooting allies
projectiletype = /obj/item/projectile/energy/piranhaspit // The projectiles I shoot
projectilesound = 'sound/weapons/thudswoosh.ogg' // The sound I make when I do it
ranged_ignore_incapitated = 1 //make it so our spitter doesnt stun lock dorks
ranged_cooldown_time = 90
//mob/living/simple_animal/hostile/piranhaplant/spitter/proc/Shoot()
//TOX/HALLOSS swap code goes here //TODO
//Piranha unique projectile
/obj/item/projectile/energy/piranhaspit
name = "piranha spit"
icon_state = "neurotoxin"
damage = 10
damage_type = HALLOSS
check_armour = "bio" //yup biohazard protection works here
flash_strength = 0
agony = 10
combustion = FALSE
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha
name = "Soylent"
desc = "This was spat out by a strange plant that eats people."
icon_state = "soylent_green"
filling_color = "#B8E6B5"
center_of_mass = list("x"=15, "y"=11)
/obj/item/projectile/energy/piranhaspit/on_hit(var/atom/soyled)
if(prob(5))
soyl(soyled)
..()
/obj/item/projectile/energy/piranhaspit/proc/soyl(var/mob/M)
var/location = get_turf(M)
new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(location)
//VORE FLUFF section and extended gut settings
/mob/living/simple_animal/hostile/piranhaplant/init_vore()
..()
var/obj/belly/B = vore_selected
B.vore_verb = "chomp up"
B.name = "stomach"
B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..."
B.digest_burn = 0
B.digest_brute = 12
/mob/living/simple_animal/hostile/piranhaplant/pitcher
icon_state = "pitcher-plant"
icon_living = "pitcher-plant"
icon_dead = "pitcher-plant_dead"
name = "Pitcher Plant"
desc = "It's a plant! How pretty"
tt_desc = "Brig Flower"
health = 500
maxHealth = 500
var/antispam = 0
swallowTime = 3 SECONDS //If you get to close to a pitcher, its your own fault ;p
/mob/living/simple_animal/hostile/piranhaplant/pitcher/death()
..()
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
qdel(src)
/mob/living/simple_animal/hostile/piranhaplant/pitcher/Life()
..()
if(!anchored)
anchored=1
if(vore_fullness && !antispam)
antispam = 1
spawn(10)
if(bruteloss >= 1)
bruteloss -= 1
antispam = !antispam
if(prob(3))
new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(src.loc)
if(size_multiplier!=1*health/100 && health >= 50 && health <= 300)
size_multiplier=1*health/100
update_icons()
/mob/living/simple_animal/hostile/piranhaplant/pitcher/New()
..()
bruteloss = 400
/mob/living/simple_animal/hostile/piranhaplant/pitcher/init_vore()
..()
var/obj/belly/B = vore_selected
B.digest_burn = 0.5
B.digest_brute = 0
B.vore_verb = "slurp up"
B.name = "pitcher"
@@ -20,7 +20,7 @@
response_help = "touches"
response_disarm = "flails at"
response_harm = "punches the"
response_harm = "punches"
harm_intent_damage = 2
@@ -19,7 +19,7 @@
firing_lines = TRUE
investigates = TRUE
assist_distance = 100
turns_per_move = 5
stop_when_pulled = 0
@@ -85,9 +85,9 @@
icon_gib = "clown_gib"
speak_chance = 50
turns_per_move = 5
response_help = "pokes the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
speak = list("HONK", "Honk!")
speak_emote = list("squeals", "cries","sobs")
emote_hear = list("honks sadly")
@@ -127,15 +127,15 @@
icon_state = "ClownGoblin"
icon_living = "ClownGoblin"
icon_dead = null
response_help = "honks the"
response_help = "honks"
speak = list("Honk!")
speak_emote = list("sqeaks")
emote_hear = list("honks")
maxHealth = 100
health = 100
view_range = 30//owo
speed = 1
turns_per_move = 1
@@ -165,7 +165,7 @@
/mob/living/simple_animal/clowngang
name = "Pandoras box"
desc = "A honkmotherload of fun"
/mob/living/simple_animal/clowngang/Life()
death()
/mob/living/simple_animal/clowngang/death()
@@ -1,5 +1,5 @@
/mob/living/simple_animal/hostile/pirate
name = "Pirate"
name = "pirate"
desc = "Does what he wants cause a pirate is free."
tt_desc = "E Homo sapiens"
icon_state = "piratemelee"
@@ -121,7 +121,8 @@
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
var/move_shoot = 0
var/ranged_ignore_incapitated = 0 //Ranged mobs will by default keep shooting on unconscious targets, if set to 1 the mob will ignore unconscious victims.
//Mob melee settings
var/melee_damage_lower = 2 // Lower bound of randomized melee damage
var/melee_damage_upper = 6 // Upper bound of randomized melee damage
@@ -1270,19 +1271,24 @@
ai_log("AttackTarget() special",3)
if(SpecialAtkTarget()) //Might not succeed/be allowed, do something else.
return 1
//AAAAH!
if(distance <= 1)
ai_log("AttackTarget() melee",3)
PunchTarget()
return 1
//Open fire!
else if(ranged && (distance <= shoot_range) && ranged_cooldown <= world.time)
if(ishuman(target_mob) && ranged_ignore_incapitated)
var/mob/living/carbon/human/TA = target_mob
if(TA.stat == UNCONSCIOUS)
LoseTarget(TA)
return
ai_log("AttackTarget() ranged",3)
ShootTarget(target_mob)
return 1
else
ai_log("AttackTarget() out of range!",3)
stoplag(1) // Unfortunately this is needed to protect from ClosestDistance() sometimes not updating fast enough to prevent an infinite loop.
@@ -1777,5 +1783,5 @@
/mob/living/simple_animal/get_nametag_desc(mob/user)
return "<i>[tt_desc]</i>"
@@ -18,9 +18,9 @@
returns_home = 1
reacts = 1
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 8
melee_damage_lower = 15
@@ -9,9 +9,9 @@
speak = list("Buzzzz")
speak_chance = 1
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
turns_per_move = 5
speed = 5
@@ -25,9 +25,9 @@
say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!")
say_got_target = list("D##FIN1Tly DNE FcukED UP nOW b0YO!", "YOU G1T D#V0VRED nOW!", "FUEL ME bOYO!", "I*M SO SORRY?!", "D1E Meat. DIG#ST!", "G1T DVNKED DWN The HaaTCH!", "Not again. NOT AGAIN!")
response_help = "pets the"
response_disarm = "bops the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("ravaged")
friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
@@ -61,3 +61,70 @@
// maxHealth = 200
// health = 200
// faction = "virgo3b"
/mob/living/simple_animal/hostile/dragon/phoron
name = "phoron dragon"
desc = "A big imposing phoron dragon, it looks tough and would likely not go down without a fierce fight."
icon_dead = "phoron_dragon_dead"
icon_living = "phoron_dragon"
icon_state = "phoron_dragon"
maxHealth = 1000 // Super Boss
health = 1000
var/image/eye_layer = null
/mob/living/simple_animal/hostile/dragon/phoron/New(var/location, var/atom/parent)
if(!eye_layer)
get_light_and_color(parent)
add_glow()
..()
/mob/living/simple_animal/hostile/dragon/phoron/proc/add_glow()
eye_layer = image(icon, "[icon_state]-glow")
eye_layer.plane = PLANE_LIGHTING_ABOVE
overlays |= eye_layer
/mob/living/simple_animal/hostile/dragon/phoron/death()
remove_glow()
..()
/mob/living/simple_animal/hostile/dragon/phoron/proc/remove_glow()
overlays -= eye_layer
/mob/living/simple_animal/hostile/dragon/phoron/update_icon()
. = ..()
if(stat >= DEAD)
return
add_glow()
/mob/living/simple_animal/hostile/dragon/phoron/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "Belly"
B.desc = "The phoron dragon tackles you to the ground with a mighty roar, swiftly gobbling up your head! You feel the gravity shift as it raises it's head up in pride, bobbing you up and down as it busily swallowed around your form. You start to realise that the warm fluid that you mistook for it's saliva has a strong and somewhat familiar scent, but before you can identify it, your ride is over - with a powerful swallow, the dragon pushes the entirety of your body down into it's stomach, with more of that strange liquid pooling up on the bottom. As you push out in protest against the surrounding walls, you realise that the flesh feels squishy and sponge-like under your digits, coating them in dark, pink substance... A pleased rumble from above tells you that the dragon clearly doesn't seem to mind your futile struggles, clenching its stomach around you possessively!"
B.emote_lists[DM_HOLD] = list(
"The sway of the dragon's belly sloshes the purple tinted fluid around you, splashing it all over your body.",
"You can feel a small prod from the outside as the dragon accidentally brushes his gut against a wall. The soft flesh cushions it just enough for it to be barely noticeable...",
"You briefly get lost in thoughts as you listen to the noises the dragon's body emits... A slightly muffled snort from above that is enough for you to snap back.",
"A sizeable paw smacks on the side of the dragon's belly, kneading into you through the thick layer of flesh while a low, ominous chuckle can be heard.",
"A low, guttural grumble can be heard all around you as the dragon idly flumps down, bringing its weight down to smoosh you against the bottom of its gut!",
"You can feel a faint, rythmic thumping coming off from the sides of the belly - it doesn't take long to realise that the dragon is drumming on its stuffed gut with its wings.",
"The dragon sways its hips briefly, making its stomach - and by extension, you - sway along, letting out an ammused rumble!",
"You can feel the stomach clench around you, briefly pushing you out towards the dragon's gullet, but before you can gather your wits, it simply swallows you back down with a taunting rumble.",
"You sigh and idly drag your hand over the stomach walls, silently pondering your life choices. It surprises you to feel a large paw tracing your movements from outside!")
B.emote_lists[DM_DIGEST] = list(
"The sway of the dragon's belly sloshes the purple tinted fluid around you, splashing it all over your body.",
"You can feel a small prod from the outside as the dragon accidentally brushes his gut against a wall. The soft flesh cushions it just enough for it to be barely noticeable...",
"A sizeable paw smacks on the side of the dragon's belly, kneading into you through the thick layer of flesh while a low, ominous chuckle can be heard.",
"A low, guttural grumble can be heard all around you as the dragon idly flumps down, bringing its weight down to smoosh you against the bottom of its gut!",
"You can feel a faint, rythmic thumping coming off from the sides of the belly - it doesn't take long to realise that the dragon is drumming on its stuffed gut with its wings.",
"The dragon sways its hips briefly, making its stomach - and by extension, you - sway along, letting out an ammused rumble!",
"You can feel the stomach clench around you, briefly pushing you out towards the dragon's gullet, but before you can gather your wits, it simply swallows you back down with a taunting rumble.")
//Didnt put in since it works better as active struggle messages, but not gonna write any at the moment :c
//You struggle to push out against the surrounding flesh, but as soon as you ease up on the pressure, the dragon's gut simply pushes back to hide the bulge.
@@ -12,9 +12,9 @@
maxHealth = 30
health = 30
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5
@@ -24,9 +24,9 @@
speak_emote = list("growls","hisses")
say_maybe_target = list("Rawr?")
say_got_target = list("GWAR!!")
response_help = "pets the"
response_disarm = "bops the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("bit")
friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
@@ -19,9 +19,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
maxHealth = 25
health = 25
speed = 4
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
isEdible = 0 //They cannot be eaten while alive.
var/canEvolve = 1 //A variable for admins to turn off and on for when they like assign a player as a mob. I want to add a verb so that they can do it on command when the conditions are right in the future.
@@ -49,14 +49,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
emote_see = list("SKREE's")
meat_type = /obj/item/toy/figure/samus
var/mob/living/victim = null // the person the metroid is currently feeding on
var/optimal_combat = FALSE // Used to dumb down the combat AI somewhat. If true, the metroid tends to be really dangerous to fight alone due to stunlocking.
var/power_charge = 0
var/evo_point = 0
var/evo_limit = 0
var/next = null
//Stuff for if a person is playing as a metroid.
show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
ai_inactive = 0 // Set to 1 to turn off most AI actions
@@ -68,10 +68,10 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
//r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this
//l_hand_sprite = "piranha_l" // they could use some icons.
player_msg = "SUCC." // Message to print to players about 'how' to play this mob on login.
/mob/living/simple_animal/hostile/metroid //activate noms
vore_active = 1
vore_pounce_chance = 25
@@ -81,8 +81,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/death()
playsound(src, 'sound/effects/metroiddeath.ogg', 50, 1)
..()
/mob/living/simple_animal/hostile/metroid/mine
name = "Mochtroid"
@@ -125,7 +125,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_lower = 1
melee_damage_upper = 5
melee_miss_chance = 0
armor = list(
armor = list(
"melee" = 50,
"bullet" = 30,
"laser" = 80,
@@ -164,20 +164,20 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
cooperative = 1
evo_point = 800
evo_limit = 1000
next = "/mob/living/simple_animal/hostile/metroid/evolution/super"
next = "/mob/living/simple_animal/hostile/metroid/evolution/super"
vore_active = 0
/mob/living/simple_animal/hostile/metroid/evolution/baby/New()
playsound(src, 'sound/metroid/metroidsee.ogg', 100, 1)
..()
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/metroid/evolution/super
name = "super metroid"
desc = "Some kind of head sucky thing!"
@@ -193,7 +193,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_lower = 2
melee_damage_upper = 5
melee_miss_chance = 0
armor = list(
armor = list(
"melee" = 50,
"bullet" = 30,
"laser" = 90,
@@ -232,7 +232,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
evo_point = 1200
evo_limit = 1400
next = "/mob/living/simple_animal/hostile/metroid/combat/alpha"
vore_active = 1
vore_bump_chance = 0
vore_capacity = 1
@@ -240,20 +240,20 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_pounce_chance = 25 //Metroids only eat incapacitated targets
vore_default_mode = DM_DIGEST
swallowTime = 1 SECONDS //Hungry little bastards.
vore_escape_chance = 25
vore_escape_chance = 25
/mob/living/simple_animal/hostile/metroid/evolution/super/New()
playsound(src, 'sound/metroid/metroidsee.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/evolution/super/death()
playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1)
..()
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
@@ -272,7 +272,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_upper = 15
melee_miss_chance = 5
attacktext = list("rammed")
armor = list(
armor = list(
"melee" = 60,
"bullet" = 45,
"laser" = 50,
@@ -283,7 +283,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
gender = NEUTER
faction = "metroids"
move_to_delay = 3
//Alphas lose their vulnerability to cold.
minbodytemp = 0
min_oxy = 0
@@ -327,14 +327,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 15 //Alphas will try knocking targets over since they lost their stun ability from the initial phases.
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
swallowTime = 3 SECONDS
vore_escape_chance = 25
//------------------------------------------------------------------------------------------------------------
@@ -354,7 +354,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_upper = 20
melee_miss_chance = 5
attacktext = list("rammed")
armor = list(
armor = list(
"melee" = 60,
"bullet" = 50,
"laser" = 50,
@@ -365,7 +365,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
gender = NEUTER
faction = "metroids"
move_to_delay = 4
move_shoot = 1 //Move and shoot at the same time.
ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
ranged_cooldown_time = 150 //How long, in deciseconds, the cooldown of ranged attacks is
@@ -407,7 +407,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/gamma/New()
playsound(src, 'sound/metroid/metroidgamma.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/combat/gamma/death()
playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1)
..()
@@ -417,14 +417,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_bump_chance = 0
vore_capacity = 1
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 15
vore_pounce_chance = 15
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
swallowTime = 3 SECONDS
vore_escape_chance = 20
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
@@ -444,7 +444,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_miss_chance = 5
attack_armor_pen = 10
attacktext = list("slashed")
armor = list(
armor = list(
"melee" = 70,
"bullet" = 60,
"laser" = 50,
@@ -455,7 +455,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
gender = NEUTER
faction = "metroids"
move_to_delay = 4
move_shoot = 1 //Move and shoot at the same time.
ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
ranged_cooldown_time = 60 //How long, in deciseconds, the cooldown of ranged attacks is
@@ -474,7 +474,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
pixel_x = -16
pixel_y = -16
old_x = -16
@@ -499,7 +499,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/zeta/New()
playsound(src, 'sound/metroid/metroidzeta.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/combat/zeta/death()
playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1)
..()
@@ -509,15 +509,15 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_bump_chance = 0
vore_capacity = 1
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 20
vore_pounce_chance = 20
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
swallowTime = 3 SECONDS
vore_escape_chance = 15
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
@@ -537,7 +537,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_miss_chance = 5
attack_armor_pen = 20
attacktext = list("slashed")
armor = list(
armor = list(
"melee" = 75,
"bullet" = 60,
"laser" = 55,
@@ -549,7 +549,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
faction = "metroids"
speed = 4
move_to_delay = 5
move_shoot = 1 //Move and shoot at the same time.
ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
ranged_cooldown_time = 150 //How long, in deciseconds, the cooldown of ranged attacks is
@@ -568,7 +568,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
old_x = -16
old_y = 0
default_pixel_x = -16
@@ -593,7 +593,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/omega/New()
playsound(src, 'sound/metroid/metroidomega.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/combat/omega/death()
playsound(src, 'sound/metroid/metroidomegadeath.ogg', 100, 1)
..()
@@ -603,21 +603,21 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_bump_chance = 0
vore_capacity = 2
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 40
vore_pounce_chance = 40
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
vore_escape_chance = 5
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/metroid/combat/queen
name = "queen metroid"
desc = "The mother of all Metroids, allowed to have grown too far!"
desc = "The mother of all Metroids - allowed to have grown too far!"
tt_desc = "Maximus Queenamus Deathamus"
icon = 'icons/mob/metroid/queen.dmi'
icon_dead = "queen_dead"
@@ -631,7 +631,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_miss_chance = 5
attack_armor_pen = 20
attacktext = list("gnashed")
armor = list(
armor = list(
"melee" = 75,
"bullet" = 60,
"laser" = 60,
@@ -661,7 +661,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
pixel_x = -16
pixel_y = -16
old_x = -16
@@ -677,18 +677,19 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
cooperative = 1
evo_point = 1100
evo_limit = INFINITY
next = "/mob/living/simple_animal/hostile/metroid/evolution/super"
next = null
/mob/living/simple_animal/hostile/metroid/combat/queen/New()
playsound(src, 'sound/metroid/metroidqueen.ogg', 100, 1)
queen_amount++
..()
/mob/living/simple_animal/hostile/metroid/combat/queen/death()
playsound(src, 'sound/metroid/metroidqueendeath.ogg', 100, 1)
queen_amount--
..()
/mob/living/simple_animal/hostile/metroid/combat/queen //active noms
vore_active = 1
vore_bump_chance = 0
@@ -705,13 +706,13 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/*
//Objects related to the Metroids.
//Objects related to the Metroids.
//Projectile for the Metroids.
*/
/obj/item/projectile/energy/metroidacid
name = "metroid acid"
icon_state = "neurotoxin"
damage = 10
@@ -719,7 +720,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
agony = 10
check_armour = "bio"
armor_penetration = 50
//EGG! Metroid egg and its mechanics. Ripped from spiders.
/obj/effect/metroid/egg
name = "egg cluster"
@@ -757,9 +758,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
//------------------------------------------------------------------------------------------------------------
/*
//LIFE STUFF, AND MECHANICS!
@@ -775,7 +776,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
release_vore_contents()
prey_excludes.Cut()
stop_consumption()
if(canEvolve == 1 && nutrition >= evo_point && !buckled && vore_fullness == 0 && !victim)
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
paralysis = 7998
@@ -793,8 +794,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
new next(get_turf(src))
visible_message("<span class='warning'>\The [src] suddenly evolves!</span>")
qdel(src)
/mob/living/simple_animal/hostile/metroid/evolution/handle_regular_status_updates()
if(stat != DEAD)
@@ -816,7 +817,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
visible_message("<span class='danger'>\The [src] starts trying to slide itself into the vent!</span>")
sleep(50) //Let's stop the metroid for five seconds to do its parking job
..()
if(entry_vent.network && entry_vent.network.normal_members.len)
if(!victim && !buckled && vore_fullness == 0 && entry_vent.network && entry_vent.network.normal_members.len)
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members)
vents.Add(temp_vent)
@@ -848,7 +849,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
if(prob(input * 2)) // Gain around one level per 50 nutrition
power_charge = min(power_charge++, 10)
/mob/living/simple_animal/hostile/metroid/evolution/PunchTarget() //this segment determines what the mob does depending on its intent.
if(victim)
return // Already eatting someone.
@@ -953,7 +954,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/evolution/DoPunch(var/mob/living/L) //Metroid melee.
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1)
if(!Adjacent(L)) // Might've moved away in the meantime.
return
@@ -1061,8 +1062,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
paralysis = 7998
sleep(50)
paralysis = 0
/mob/living/simple_animal/hostile/metroid/evolution/FindTarget() //This makes it so it doesn't go after another target while succing.
if(victim) // Don't worry about finding another target if we're sucking on someone's head.
return
@@ -1080,9 +1081,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
return
else
..()
/mob/living/simple_animal/hostile/metroid/evolution/baby/Found(mob/living/L)
if(isliving(L))
if(SA_attackable(L))
@@ -1093,21 +1094,21 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
return H // Monkeys are always food.
else
return
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return H // Monkeys are always food.
return
/*
//LIFE PROCS!
//FOR THE COMBAT FORMS
//LIFE PROCS!
//FOR THE COMBAT FORMS
*/
@@ -1118,32 +1119,23 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
if(canEvolve == 1 && nutrition >= evo_limit && vore_fullness == TRUE) //spit dat crap out if nutrition gets too high!
release_vore_contents()
prey_excludes.Cut()
if(canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0)
if(canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0 && next != "/mob/living/simple_animal/hostile/metroid/combat/queen")
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
paralysis = 7998
sleep(50)
paralysis = 0
expand_troid()
return
if(stance == 7) //Necessary to fix a bug where if their prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing.
stance = 4
return
/mob/living/simple_animal/hostile/metroid/combat/omega/Life()
. = ..()
if(queen_amount == 0 && prob(5) && canEvolve == 1 && nutrition >= evo_point)
else if(queen_amount == 0 && prob(5) && canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0 && next == "/mob/living/simple_animal/hostile/metroid/combat/queen")
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
queen_amount++
paralysis = 7998
sleep(50)
paralysis = 0
expand_troid()
/mob/living/simple_animal/hostile/metroid/combat/queen/Life()
. = ..()
var/obj/effect/metroid/egg/E = locate() in get_turf(src)
if(canEvolve == 1 && nutrition >= evo_point && !E)
else if(next == null && canEvolve == 1 && nutrition >= evo_point)
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
src.visible_message("<span class='notice'>\The [src] begins to lay an egg.</span>")
stop_automated_movement = 1
@@ -1153,7 +1145,12 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
nutrition = 400
return
if(stance == 7) //Necessary to fix a bug where if their prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing.
stance = 4
return
/mob/living/simple_animal/hostile/metroid/combat/proc/adjust_nutrition(input)
nutrition = (nutrition + input) //It handles the metroid's nutrition gain from melee.
@@ -1171,7 +1168,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/DoPunch(var/mob/living/L) //Metroid actions vs the player.
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1)
if(!Adjacent(L)) // Might've moved away in the meantime.
return
@@ -1187,12 +1184,12 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
if(I_HURT) //The metroid does this if it can't latch onto the target or it decides not to try knocking them down.
ai_log("DoPunch() against [L], hurting.",2)
L.attack_generic(src, damage_to_do, pick(attacktext))
playsound(src, 'sound/weapons/bite.ogg', 75, 1)
// Give the Metroid some nutrition, if applicable, even if not attached.
if(!L.isSynthetic())
if(ishuman(L))
@@ -34,9 +34,9 @@
say_got_target = list("Rurrr!", "ROAR!", "MARR!", "RERR!", "RAHH!", "RAH!", "WARF!")
melee_damage_lower = 5
melee_damage_upper = 15 //Don't break my bones bro
response_help = "pets the"
response_disarm = "bops the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("mauled")
friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
meat_amount = 6
@@ -25,9 +25,9 @@
emote_see = list("runs in a circle", "shakes", "scritches at something")
say_maybe_target = list("Squeek?")
say_got_target = list("SQUEEK!")
response_help = "pets the"
response_disarm = "bops the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("ravaged")
friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
@@ -12,9 +12,9 @@
maxHealth = 30
health = 30
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5
@@ -56,3 +56,40 @@
health = 100
melee_damage_lower = 10
melee_damage_upper = 20
/mob/living/simple_animal/redpanda/alt
icon = 'icons/mob/vore48x48.dmi'
icon_state = "wah_alt"
icon_living = "wah_alt"
icon_dead = "wah_alt_dead"
pixel_x = -7
/mob/living/simple_animal/redpanda/alt/waaah
name = "waaah"
desc = "It's a waaah! Waaaaaaaaaah!"
tt_desc = "Ailurus waaahius"
icon_state = "wah_altwaaah"
icon_living = "wah_altwaaah"
icon_dead = "wah_altwaaah_dead"
maxHealth = 150
health = 150
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5
melee_damage_upper = 2
attacktext = list("bapped rapidly!")
turns_per_move = 1
speak_chance = 25
speak = list("Waaah!",
"Waaah?",
"Waaaaaaaaaah!")
emote_hear = list("wahs!","wahs even more!")
emote_see = list("trundles around wahing","rears up onto their hind legs and wahs at everyone!")
@@ -0,0 +1,203 @@
/mob/living/simple_animal/shadekin/initialize()
var/list/ability_types = subtypesof(/obj/effect/shadekin_ability)
if(name == "Rakshasa")
ability_types += subtypesof(/obj/effect/rakshasa_ability)
shadekin_abilities = list()
for(var/type in ability_types)
shadekin_abilities += new type(src)
update_icon()
return ..()
/obj/effect/rakshasa_ability
name = ""
desc = ""
icon = 'icons/mob/screen_spells.dmi'
var/ability_name = "FIX ME"
var/cost = 50
var/mob/living/simple_animal/shadekin/my_kin
var/shift_mode = NOT_WHILE_SHIFTED
var/ab_sound
/obj/effect/rakshasa_ability/New(var/new_kin)
..()
my_kin = new_kin
loc = null
/obj/effect/rakshasa_ability/Destroy()
my_kin = null
return ..()
/obj/effect/rakshasa_ability/proc/atom_button_text()
var/shift_denial
if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED))
shift_denial = "Physical Only"
else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED))
shift_denial = "Shifted Only"
if(shift_denial)
name = shift_denial
else
name = my_kin.energy >= cost ? "Activate" : "No Energy"
return src
/obj/effect/rakshasa_ability/Click(var/location, var/control, var/params)
if(my_kin.stat) return
var/list/clickprops = params2list(params)
var/opts = clickprops["shift"]
if(opts)
to_chat(my_kin,"<span class='notice'><b>[name]</b> (Cost: [cost]%) - [desc]</span>")
else
do_ability(my_kin)
/obj/effect/rakshasa_ability/proc/do_ability()
if(my_kin.stat)
to_chat(my_kin,"<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED))
to_chat(my_kin,"<span class='warning'>Can't use that ability while phase shifted!</span>")
return FALSE
else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED))
to_chat(my_kin,"<span class='warning'>Can only use that ability while phase shifted!</span>")
return FALSE
else if(my_kin.energy < cost)
to_chat(my_kin,"<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
my_kin.energy -= cost
if(ab_sound)
playsound(src,ab_sound,75,1)
return TRUE
/obj/effect/rakshasa_ability/phase_shift2
ability_name = "Goo Shift"
desc = "Shift yourself with goopy effects."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/phase_shift2/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(loc, src)
playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
my_kin.phase_shift()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
else
cost = initial(cost)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
playsound(my_kin.loc, 'sound/rakshasa/Emerge0.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/phase_shift3
ability_name = "Goo Shift No Emerge"
desc = "Shift yourself with goopy effects."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/phase_shift3/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(loc, src)
playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
my_kin.phase_shift()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
else
cost = initial(cost)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/drip_oil
ability_name = "Goo Drip"
desc = "Drip some goo."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/drip_oil/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/laugh
ability_name = "Laugh"
desc = "Laugh."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/laugh/do_ability()
if(!..())
return
playsound(my_kin.loc, 'sound/rakshasa/Laugh.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/no
ability_name = "Say No"
desc = "Say no!"
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/no/do_ability()
if(!..())
return
playsound(my_kin.loc, 'sound/rakshasa/No.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/trap
ability_name = "Lay Trap"
desc = "Lay a trap that will notify you when someone steps in it."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/trap/do_ability()
if(!..())
return
var/goo_sounds = list (
'sound/rakshasa/Corrosion1.ogg',
'sound/rakshasa/Corrosion2.ogg',
'sound/rakshasa/Corrosion3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
new /obj/structure/gootrap (my_kin.loc)
@@ -0,0 +1,76 @@
/obj/structure/gootrap
name = "goo"
throw_speed = 2
throw_range = 1
gender = PLURAL
icon = 'icons/effects/blood.dmi'
var/base_icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
var/basecolor="#030303"
desc = ""
throwforce = 0
w_class = ITEMSIZE_NORMAL
matter = list(DEFAULT_WALL_MATERIAL = 18750)
var/deployed = 1
anchored = 1
/obj/structure/gootrap/proc/can_use(mob/user)
return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained())
/obj/structure/gootrap/update_icon()
..()
color = basecolor
/obj/structure/gootrap/New()
..()
update_icon()
return
/obj/structure/gootrap/attack_hand(mob/user as mob)
if(has_buckled_mobs() && can_use(user))
var/victim = english_list(buckled_mobs)
user.visible_message(
"<span class='notice'>[user] begins freeing [victim] from \the [src].</span>",
"<span class='notice'>You carefully begin to free [victim] from \the [src].</span>",
)
if(do_after(user, 5))
user.visible_message("<span class='notice'>[victim] has been freed from \the [src] by [user].</span>")
for(var/A in buckled_mobs)
unbuckle_mob(A)
anchored = 0
else
..()
/obj/structure/gootrap/proc/attack_mob(mob/living/L)
//trap the victim in place
set_dir(L.dir)
can_buckle = 1
buckle_mob(L)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(src, sound, 100, 1)
L << "<span class='danger'>You hear a gooey schlorp as \the [src] ensnares your leg, trapping you in place!</span>"
deployed = 0
can_buckle = initial(can_buckle)
/obj/structure/gootrap/Crossed(AM as mob|obj)
if(deployed && isliving(AM))
var/mob/living/L = AM
if(L.m_intent == "run")
L.visible_message(
"<span class='danger'>[L] steps on \the [src].</span>",
"<span class='danger'>You step on \the [src]!</span>",
"<b>You hear a gooey schlorp as the goo ensnares your leg!</b>"
)
attack_mob(L)
if(!has_buckled_mobs())
anchored = 0
deployed = 0
message_admins("[key_name(usr)] has stepped in the goo trap.")
..()
@@ -43,9 +43,9 @@
emote_see = list("tailtwitches", "earflicks")
say_maybe_target = list("...mar?")
say_got_target = list("MAR!!!")
response_help = "pets the"
response_disarm = "bops the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("mauled","slashed","clawed")
friendly = list("boops", "pawbs", "mars softly at", "sniffs on")
reactions = list("Mar?" = "Marrr!", "Mar!" = "Marrr???", "Mar." = "Marrr.")
@@ -52,6 +52,24 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD)
athena_panels
name = "Hephaestus - Athena FBP Panels"
icon_state = "athena_p"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
athena_panels_body
name = "Hephaestus - Athena FBP Panels (body)"
icon_state = "athena_p"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
athena_panels_head
name = "Hephaestus - Athena FBP Panels (head)"
icon_state = "athena_p"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
rook_lights
name = "Bishop - Rook lights"
icon_state = "rook-l"