Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 2/28/2016_armor

This commit is contained in:
Neerti
2016-03-06 04:19:33 -05:00
111 changed files with 1043 additions and 4407 deletions
+2 -8
View File
@@ -145,16 +145,10 @@ proc/admin_notice(var/message, var/rights)
body += {"<br><br>
<b>Rudimentary transformation:</b><font size=2><br>These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.</font><br>
<A href='?src=\ref[src];simplemake=observer;mob=\ref[M]'>Observer</A> |
\[ Xenos: <A href='?src=\ref[src];simplemake=larva;mob=\ref[M]'>Larva</A>
<A href='?src=\ref[src];simplemake=human;species=Xenomorph Drone;mob=\ref[M]'>Drone</A>
<A href='?src=\ref[src];simplemake=human;species=Xenomorph Hunter;mob=\ref[M]'>Hunter</A>
<A href='?src=\ref[src];simplemake=human;species=Xenomorph Sentinel;mob=\ref[M]'>Sentinel</A>
<A href='?src=\ref[src];simplemake=human;species=Xenomorph Queen;mob=\ref[M]'>Queen</A> \] |
\[ Crew: <A href='?src=\ref[src];simplemake=human;mob=\ref[M]'>Human</A>
<A href='?src=\ref[src];simplemake=human;species=Unathi;mob=\ref[M]'>Unathi</A>
<A href='?src=\ref[src];simplemake=human;species=Tajaran;mob=\ref[M]'>Tajaran</A>
<A href='?src=\ref[src];simplemake=human;species=Skrell;mob=\ref[M]'>Skrell</A>
<A href='?src=\ref[src];simplemake=human;species=Vox;mob=\ref[M]'>Vox</A> \] | \[
<A href='?src=\ref[src];simplemake=human;species=Skrell;mob=\ref[M]'>Skrell</A> \] | \[
<A href='?src=\ref[src];simplemake=nymph;mob=\ref[M]'>Nymph</A>
<A href='?src=\ref[src];simplemake=human;species='Diona';mob=\ref[M]'>Diona</A> \] |
\[ slime: <A href='?src=\ref[src];simplemake=slime;mob=\ref[M]'>Baby</A>,
@@ -1356,7 +1350,7 @@ proc/admin_notice(var/message, var/rights)
message_admins(msg)
else
usr << "You do not have access to this command."
/datum/admins/proc/add_tcrystals(mob/living/carbon/human/H as mob)
set category = "Debug"
set name = "Add Telecrystals"
+1 -1
View File
@@ -822,7 +822,7 @@ var/list/admin_verbs_mentor = list(
if(!istype(M, /mob/living/carbon/human))
usr << "\red You can only do this to humans!"
return
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Vox and Tajaran can result in unintended consequences.",,"Yes","No"))
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi, Tajaran can result in unintended consequences.",,"Yes","No"))
if("No")
return
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
@@ -1,7 +0,0 @@
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation
name = "Trigger a Xenomorph Infestation"
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation/execute(var/mob/user)
. = ..()
if(.)
return xenomorphs.attempt_random_spawn()
-10
View File
@@ -1119,16 +1119,6 @@
log_admin("[key_name(usr)] AIized [key_name(H)]")
H.AIize()
else if(href_list["makealien"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["makealien"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
usr.client.cmd_admin_alienize(H)
else if(href_list["makeslime"])
if(!check_rights(R_SPAWN)) return
-17
View File
@@ -100,23 +100,6 @@
paiController.pai_candidates.Remove(candidate)
feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_alienize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make Alien"
if(!ticker)
alert("Wait until the game starts")
return
if(ishuman(M))
log_admin("[key_name(src)] has alienized [M.key].")
spawn(10)
M:Alienize()
feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] made [key_name(M)] into an alien.")
message_admins("\blue [key_name_admin(usr)] made [key_name(M)] into an alien.", 1)
else
alert("Invalid mob")
/client/proc/cmd_admin_slimeize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make slime"
@@ -75,7 +75,6 @@
<option value='?_src_=vars;makeai=\ref[src]'>Make AI</option>
<option value='?_src_=vars;makerobot=\ref[src]'>Make cyborg</option>
<option value='?_src_=vars;makemonkey=\ref[src]'>Make monkey</option>
<option value='?_src_=vars;makealien=\ref[src]'>Make alien</option>
<option value='?_src_=vars;makeslime=\ref[src]'>Make slime</option>
"}
-4
View File
@@ -90,10 +90,6 @@
if(V)
V.ex_act(2)
return
var/obj/machinery/bot/B = locate() in T
if(B)
B.ex_act(2)
return
var/obj/mecha/M = locate() in T
if(M)
M.visible_message("<span class='danger'>The blob attacks \the [M]!</span>")
+3
View File
@@ -281,6 +281,9 @@
if(inactivity > duration) return inactivity
return 0
/client/proc/last_activity_seconds()
return inactivity / 10
//send resources to the client. It's here in its own proc so we can move it around easiliy if need be
/client/proc/send_resources()
+3 -9
View File
@@ -8,7 +8,7 @@
Sprites used when the clothing item is refit. This is done by setting icon_override.
For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary.
Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits),
while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. vox wearing jumpsuits).
while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits).
*/
var/list/sprite_sheets_refit = null
var/ear_protection = 0
@@ -204,9 +204,8 @@
body_parts_covered = HANDS
slot_flags = SLOT_GLOVES
attack_verb = list("challenged")
species_restricted = list("exclude","Unathi","Tajara", "Vox")
species_restricted = list("exclude","Unathi","Tajara")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi',
"Teshari" = 'icons/mob/species/seromi/gloves.dmi',
)
@@ -264,7 +263,6 @@
var/on = 0
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Teshari" = 'icons/mob/species/seromi/head.dmi'
)
@@ -363,7 +361,6 @@
slot_flags = SLOT_MASK
body_parts_covered = FACE|EYES
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/masks.dmi',
"Teshari" = 'icons/mob/species/seromi/masks.dmi',
)
@@ -397,9 +394,8 @@
slowdown = SHOES_SLOWDOWN
force = 2
var/overshoes = 0
species_restricted = list("exclude","Teshari", "Unathi","Tajara","Vox")
species_restricted = list("exclude","Teshari", "Unathi","Tajara")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/shoes.dmi',
"Teshari" = 'icons/mob/species/seromi/shoes.dmi',
)
@@ -474,7 +470,6 @@
w_class = 3
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Teshari" = 'icons/mob/species/seromi/suit.dmi'
)
@@ -511,7 +506,6 @@
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi',
"Teshari" = 'icons/mob/species/seromi/uniform.dmi'
)
-1
View File
@@ -27,7 +27,6 @@ BLIND // can't see anything
var/obj/screen/overlay = null
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Teshari" = 'icons/mob/species/seromi/eyes.dmi'
)
@@ -10,7 +10,6 @@
desc = "an ultra rare hat. It commands a certain respect."
icon_state = "petehat"
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Teshari" = 'icons/mob/species/seromi/head.dmi'
)
-6
View File
@@ -43,12 +43,6 @@
siemens_coefficient = 0.7
body_parts_covered = FACE|EYES
/obj/item/clothing/mask/gas/swat/vox
name = "\improper alien mask"
desc = "Clearly not designed for a human face."
body_parts_covered = 0 //Hack to allow vox to eat while wearing this mask.
species_restricted = list("Vox")
/obj/item/clothing/mask/gas/syndicate
name = "tactical mask"
desc = "A close-fitting tactical mask that can be connected to an air supply."
-138
View File
@@ -28,141 +28,3 @@
/obj/item/clothing/suit/space/skrell/black
icon_state = "skrell_suit_black"
item_state = "skrell_suit_black"
// Vox space gear (vaccuum suit, low pressure armour)
// Can't be equipped by any other species due to bone structure and vox cybernetics.
/obj/item/clothing/suit/space/vox
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank)
slowdown = 2
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0.6
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
species_restricted = list("Vox")
/obj/item/clothing/head/helmet/space/vox
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0.6
item_flags = STOPPRESSUREDAMAGE
species_restricted = list("Vox")
/obj/item/clothing/head/helmet/space/vox/pressure
name = "alien helmet"
icon_state = "vox-pressure"
item_state = "vox-pressure"
desc = "Hey, wasn't this a prop in \'The Abyss\'?"
/obj/item/clothing/suit/space/vox/pressure
name = "alien pressure suit"
icon_state = "vox-pressure"
item_state = "vox-pressure"
desc = "A huge, armoured, pressurized suit, designed for distinctly nonhuman proportions."
/obj/item/clothing/head/helmet/space/vox/carapace
name = "alien visor"
icon_state = "vox-carapace"
item_state = "vox-carapace"
desc = "A glowing visor, perhaps stolen from a depressed Cylon."
/obj/item/clothing/suit/space/vox/carapace
name = "alien carapace armour"
icon_state = "vox-carapace"
item_state = "vox-carapace"
desc = "An armoured, segmented carapace with glowing purple lights. It looks pretty run-down."
/obj/item/clothing/head/helmet/space/vox/stealth
name = "alien stealth helmet"
icon_state = "vox-stealth"
item_state = "vox-stealth"
desc = "A smoothly contoured, matte-black alien helmet."
/obj/item/clothing/suit/space/vox/stealth
name = "alien stealth suit"
icon_state = "vox-stealth"
item_state = "vox-stealth"
desc = "A sleek black suit. It seems to have a tail, and is very heavy."
/obj/item/clothing/head/helmet/space/vox/medic
name = "alien goggled helmet"
icon_state = "vox-medic"
item_state = "vox-medic"
desc = "An alien helmet with enormous goggled lenses."
/obj/item/clothing/suit/space/vox/medic
name = "alien armour"
icon_state = "vox-medic"
item_state = "vox-medic"
desc = "An almost organic looking nonhuman pressure suit."
/obj/item/clothing/under/vox
has_sensor = 0
species_restricted = list("Vox")
/obj/item/clothing/under/vox/vox_casual
name = "alien clothing"
desc = "This doesn't look very comfortable."
icon_state = "vox-casual-1"
item_state = "vox-casual-1"
body_parts_covered = LEGS
/obj/item/clothing/under/vox/vox_robes
name = "alien robes"
desc = "Weird and flowing!"
icon_state = "vox-casual-2"
item_state = "vox-casual-2"
/obj/item/clothing/gloves/yellow/vox
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
name = "insulated gauntlets"
icon_state = "gloves-vox"
item_state = "gloves-vox"
siemens_coefficient = 0
permeability_coefficient = 0.05
species_restricted = list("Vox")
/obj/item/clothing/shoes/magboots/vox
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
name = "vox magclaws"
item_state = "boots-vox"
icon_state = "boots-vox"
species_restricted = list("Vox")
action_button_name = "Toggle the magclaws"
/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user)
if(src.magpulse)
item_flags &= ~NOSLIP
magpulse = 0
canremove = 1
user << "You relax your deathgrip on the flooring."
else
//make sure these can only be used when equipped.
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if (H.shoes != src)
user << "You will have to put on the [src] before you can do that."
return
item_flags |= NOSLIP
magpulse = 1
canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly.
user << "You dig your claws deeply into the flooring, bracing yourself."
user << "It would be hard to take off the [src] without relaxing your grip first."
user.update_action_buttons()
//In case they somehow come off while enabled.
/obj/item/clothing/shoes/magboots/vox/dropped(mob/user as mob)
..()
if(src.magpulse)
user.visible_message("The [src] go limp as they are removed from [usr]'s feet.", "The [src] go limp as they are removed from your feet.")
item_flags &= ~NOSLIP
magpulse = 0
canremove = 1
/obj/item/clothing/shoes/magboots/vox/examine(mob/user)
..(user)
if (magpulse)
user << "It would be hard to take these off without relaxing your grip first." //theoretically this message should only be seen by the wearer when the claws are equipped.
@@ -18,7 +18,7 @@
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona", "Xenomorph")
species_restricted = list("exclude","Diona")
var/obj/machinery/camera/camera
var/list/camera_networks
@@ -63,7 +63,7 @@
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
siemens_coefficient = 0.9
species_restricted = list("exclude","Diona", "Xenomorph")
species_restricted = list("exclude","Diona")
var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit.
+37 -40
View File
@@ -21,12 +21,14 @@
var/cash_stored = 0
var/obj/item/confirm_item
var/datum/money_account/linked_account
var/account_to_connect = null
// Claim machine ID
/obj/machinery/cash_register/New()
machine_id = "[station_name()] RETAIL #[num_financial_terminals++]"
cash_stored = rand(10, 70)*10
transaction_devices += src // Global reference list to be properly set up by /proc/setup_economy()
/obj/machinery/cash_register/examine(mob/user as mob)
@@ -39,6 +41,9 @@
/obj/machinery/cash_register/attack_hand(mob/user as mob)
// Don't be accessible from the wrong side of the machine
if(get_dir(src, user) & reverse_dir[src.dir]) return
if(cash_open)
if(cash_stored)
spawn_money(cash_stored, loc, user)
@@ -278,26 +283,24 @@
usr << "\icon[src]<span class='warning'>The cash box is open.</span>"
return
// Access account for transaction
if(check_account())
if(transaction_amount > SC.worth)
src.visible_message("\icon[src]<span class='warning'>Not enough money.</span>")
else
// Insert cash into magical slot
SC.worth -= transaction_amount
SC.update_icon()
if(!SC.worth)
if(ishuman(SC.loc))
var/mob/living/carbon/human/H = SC.loc
H.drop_from_inventory(SC)
qdel(SC)
cash_stored += transaction_amount
if(transaction_amount > SC.worth)
src.visible_message("\icon[src]<span class='warning'>Not enough money.</span>")
else
// Insert cash into magical slot
SC.worth -= transaction_amount
SC.update_icon()
if(!SC.worth)
if(ishuman(SC.loc))
var/mob/living/carbon/human/H = SC.loc
H.drop_from_inventory(SC)
qdel(SC)
cash_stored += transaction_amount
// Save log
add_transaction_log("n/A", "Cash", transaction_amount)
// Save log
add_transaction_log("n/A", "Cash", transaction_amount)
// Confirm and reset
transaction_complete()
// Confirm and reset
transaction_complete()
/obj/machinery/cash_register/proc/scan_item_price(obj/O)
@@ -436,39 +439,33 @@
cash_locked = 0
open_cash_box()
//--Premades--//
/obj/machinery/cash_register/command
New()
linked_account = department_accounts["Command"]
..()
/obj/machinery/cash_register/medical
account_to_connect = "Command"
..()
New()
linked_account = department_accounts["Medical"]
..()
/obj/machinery/cash_register/medical
account_to_connect = "Medical"
..()
/obj/machinery/cash_register/engineering
New()
linked_account = department_accounts["Engineering"]
..()
account_to_connect = "Engineering"
..()
/obj/machinery/cash_register/science
New()
linked_account = department_accounts["Science"]
..()
account_to_connect = "Science"
..()
/obj/machinery/cash_register/security
New()
linked_account = department_accounts["Security"]
..()
account_to_connect = "Security"
..()
/obj/machinery/cash_register/cargo
New()
linked_account = department_accounts["Cargo"]
..()
account_to_connect = "Cargo"
..()
/obj/machinery/cash_register/civilian
New()
linked_account = department_accounts["Civilian"]
..()
account_to_connect = "Civilian"
..()
+9 -2
View File
@@ -52,8 +52,7 @@
/datum/species/skrell = 12,
/datum/species/teshari = 9, // Skrell sponsored!
/datum/species/tajaran = 7,
/datum/species/unathi = 7,
/datum/species/vox = 1
/datum/species/unathi = 7
)
//---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel:
@@ -81,6 +80,7 @@ var/global/list/datum/money_account/department_accounts = list()
var/global/num_financial_terminals = 1
var/global/next_account_number = 0
var/global/list/all_money_accounts = list()
var/global/list/transaction_devices = list()
var/global/economy_init = 0
/proc/setup_economy()
@@ -102,6 +102,13 @@ var/global/economy_init = 0
create_department_account("Vendor")
vendor_account = department_accounts["Vendor"]
for(var/obj/item/device/retail_scanner/RS in transaction_devices)
if(RS.account_to_connect)
RS.linked_account = department_accounts[RS.account_to_connect]
for(var/obj/machinery/cash_register/CR in transaction_devices)
if(CR.account_to_connect)
CR.linked_account = department_accounts[CR.account_to_connect]
current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [game_year]"
economy_init = 1
+17 -22
View File
@@ -17,6 +17,7 @@
var/obj/item/confirm_item
var/datum/money_account/linked_account
var/account_to_connect = null
// Claim machine ID
@@ -24,6 +25,7 @@
machine_id = "[station_name()] RETAIL #[num_financial_terminals++]"
if(locate(/obj/structure/table) in loc)
pixel_y = 3
transaction_devices += src // Global reference list to be properly set up by /proc/setup_economy()
// Always face the user when put on a table
@@ -315,36 +317,29 @@
//--Premades--//
/obj/item/device/retail_scanner/command
New()
linked_account = department_accounts["Command"]
..()
/obj/item/device/retail_scanner/medical
account_to_connect = "Command"
..()
New()
linked_account = department_accounts["Medical"]
..()
/obj/item/device/retail_scanner/medical
account_to_connect = "Medical"
..()
/obj/item/device/retail_scanner/engineering
New()
linked_account = department_accounts["Engineering"]
..()
account_to_connect = "Engineering"
..()
/obj/item/device/retail_scanner/science
New()
linked_account = department_accounts["Science"]
..()
account_to_connect = "Science"
..()
/obj/item/device/retail_scanner/security
New()
linked_account = department_accounts["Security"]
..()
account_to_connect = "Security"
..()
/obj/item/device/retail_scanner/cargo
New()
linked_account = department_accounts["Cargo"]
..()
account_to_connect = "Cargo"
..()
/obj/item/device/retail_scanner/civilian
New()
linked_account = department_accounts["Civilian"]
..()
account_to_connect = "Civilian"
..()
-6
View File
@@ -86,12 +86,6 @@
"admin","ponies","heresy","meow","Pun Pun","monkey","Ian","moron","pizza","message","spam",\
"director", "Hello", "Hi!"," ","nuke","crate","dwarf","xeno")
/datum/event/ionstorm/tick()
if(botEmagChance)
for(var/obj/machinery/bot/bot in world)
if(prob(botEmagChance))
bot.emag_act(1)
/datum/event/ionstorm/end()
spawn(rand(5000,8000))
if(prob(50))
-20
View File
@@ -1151,23 +1151,3 @@
set_trait(TRAIT_PRODUCTION,7)
set_trait(TRAIT_YIELD,3)
set_trait(TRAIT_POTENCY,3)
// Alien weeds.
/datum/seed/xenomorph
name = "xenomorph"
seed_name = "alien weed"
display_name = "alien weeds"
force_layer = 3
chems = list("phoron" = list(1,3))
/datum/seed/xenomorph/New()
..()
set_trait(TRAIT_PLANT_ICON,"vine2")
set_trait(TRAIT_IMMUTABLE,1)
set_trait(TRAIT_PRODUCT_COLOUR,"#3D1934")
set_trait(TRAIT_FLESH_COLOUR,"#3D1934")
set_trait(TRAIT_PLANT_COLOUR,"#3D1934")
set_trait(TRAIT_PRODUCTION,1)
set_trait(TRAIT_YIELD,-1)
set_trait(TRAIT_SPREAD,2)
set_trait(TRAIT_POTENCY,50)
+2 -17
View File
@@ -556,8 +556,8 @@ var/list/name_to_material
sheet_plural_name = "ingots"
// Adminspawn only, do not let anyone get this.
/material/voxalloy
name = "voxalloy"
/material/alienalloy
name = "alienalloy"
display_name = "durable alloy"
stack_type = null
icon_colour = "#6C7364"
@@ -640,21 +640,6 @@ var/list/name_to_material
/material/cult/reinf/place_dismantled_product(var/turf/target)
new /obj/effect/decal/remains/human(target)
/material/resin
name = "resin"
icon_colour = "#E85DD8"
dooropen_noise = 'sound/effects/attackblob.ogg'
door_icon_base = "resin"
melting_point = T0C+300
sheet_singular_name = "blob"
sheet_plural_name = "blobs"
/material/resin/can_open_material_door(var/mob/living/user)
var/mob/living/carbon/M = user
if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
return 1
return 0
//TODO PLACEHOLDERS:
/material/leather
name = "leather"
+2 -4
View File
@@ -21,7 +21,7 @@
generate_loot()
/obj/structure/closet/crate/secure/loot/proc/generate_loot()
var/loot = rand(1, 100)
var/loot = rand(1, 99)
switch(loot)
if(1 to 5) // Common things go, 5%
new/obj/item/weapon/reagent_containers/food/drinks/bottle/rum(src)
@@ -104,7 +104,7 @@
if(88)
new/obj/item/xenos_claw(src)
if(89)
new/obj/item/organ/internal/xenos/plasmavessel(src)
new/obj/item/clothing/head/bearpelt(src)
if(90)
new/obj/item/organ/internal/heart(src)
if(91)
@@ -142,8 +142,6 @@
if(99)
new/obj/item/weapon/storage/belt/champion(src)
new/obj/item/clothing/mask/luchador(src)
if(100)
new/obj/item/clothing/head/bearpelt(src)
/obj/structure/closet/crate/secure/loot/togglelock(mob/user as mob)
if(!locked)
-1
View File
@@ -9,7 +9,6 @@ var/list/holder_mob_icon_cache = list()
show_messages = 1
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Teshari" = 'icons/mob/species/seromi/head.dmi'
)
-46
View File
@@ -1,34 +1,3 @@
/datum/language/xenocommon
name = "Xenomorph"
colour = "alien"
desc = "The common tongue of the xenomorphs."
speech_verb = "hisses"
ask_verb = "hisses"
exclaim_verb = "hisses"
key = "4"
flags = RESTRICTED
syllables = list("sss","sSs","SSS")
/datum/language/xenos
name = "Hivemind"
desc = "Xenomorphs have the strange ability to commune over a psychic hivemind."
speech_verb = "hisses"
ask_verb = "hisses"
exclaim_verb = "hisses"
colour = "alien"
key = "a"
flags = RESTRICTED | HIVEMIND
/datum/language/xenos/check_special_condition(var/mob/other)
var/mob/living/carbon/M = other
if(!istype(M))
return 1
if(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
return 1
return 0
/datum/language/ling
name = "Changeling"
desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance."
@@ -68,21 +37,6 @@
speaker_mask = B.truename
..(speaker,message,speaker_mask)
/datum/language/vox
name = "Vox-pidgin"
desc = "The common tongue of the various Vox ships making up the Shoal. It sounds like chaotic shrieking to everyone else."
speech_verb = "shrieks"
ask_verb = "creels"
exclaim_verb = "SHRIEKS"
colour = "vox"
key = "5"
flags = WHITELISTED
syllables = list("ti","ti","ti","hi","hi","ki","ki","ki","ki","ya","ta","ha","ka","ya","chi","cha","kah", \
"SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA")
/datum/language/vox/get_random_name()
return ..(FEMALE,1,6)
/datum/language/cultcommon
name = "Cult"
desc = "The chants of the occult, the incomprehensible."
+69
View File
@@ -29,6 +29,8 @@
access_scanner.req_access = req_access.Copy()
access_scanner.req_one_access = req_one_access.Copy()
turn_on()
/mob/living/bot/Life()
..()
if(health <= 0)
@@ -125,3 +127,70 @@
/mob/living/bot/attack_throat()
return
/******************************************************************/
// Navigation procs
// Used for A-star pathfinding
// Returns the surrounding cardinal turfs with open links
// Including through doors openable with the ID
/turf/proc/CardinalTurfsWithAccess(var/obj/item/weapon/card/id/ID)
var/L[] = new()
// for(var/turf/simulated/t in oview(src,1))
for(var/d in cardinal)
var/turf/simulated/T = get_step(src, d)
if(istype(T) && !T.density)
if(!LinkBlockedWithAccess(src, T, ID))
L.Add(T)
return L
// Returns true if a link between A and B is blocked
// Movement through doors allowed if ID has access
/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/weapon/card/id/ID)
if(A == null || B == null) return 1
var/adir = get_dir(A,B)
var/rdir = get_dir(B,A)
if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal
var/iStep = get_step(A,adir&(NORTH|SOUTH))
if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID))
return 0
var/pStep = get_step(A,adir&(EAST|WEST))
if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID))
return 0
return 1
if(DirBlockedWithAccess(A,adir, ID))
return 1
if(DirBlockedWithAccess(B,rdir, ID))
return 1
for(var/obj/O in B)
if(O.density && !istype(O, /obj/machinery/door) && !(O.flags & ON_BORDER))
return 1
return 0
// Returns true if direction is blocked from loc
// Checks doors against access with given ID
/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/weapon/card/id/ID)
for(var/obj/structure/window/D in loc)
if(!D.density) continue
if(D.dir == SOUTHWEST) return 1
if(D.dir == dir) return 1
for(var/obj/machinery/door/D in loc)
if(!D.density) continue
if(istype(D, /obj/machinery/door/window))
if( dir & D.dir ) return !D.check_access(ID)
//if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID)
//if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID)
else return !D.check_access(ID) // it's a real, air blocking door
return 0
+438
View File
@@ -0,0 +1,438 @@
#define MULE_IDLE 0
#define MULE_MOVING 1
#define MULE_UNLOAD 2
#define MULE_LOST 3
#define MULE_CALC_MIN 4
#define MULE_CALC_MAX 10
#define MULE_PATH_DONE 11
// IF YOU CHANGE THOSE, UPDATE THEM IN pda.tmpl TOO
/mob/living/bot/mulebot
name = "Mulebot"
desc = "A Multiple Utility Load Effector bot."
icon_state = "mulebot0"
anchored = 1
density = 1
health = 150
maxHealth = 150
mob_bump_flag = HEAVY
botcard_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
var/busy = 0
var/mode = MULE_IDLE
var/atom/movable/load
var/crates_only = 1
var/auto_return = 1
var/safety = 1
var/list/path = list()
var/frustration = 0
var/turf/target
var/targetName
var/turf/home
var/homeName
var/turf/obstacle
var/global/amount = 0
/mob/living/bot/mulebot/New()
..()
var/turf/T = get_turf(loc)
var/obj/machinery/navbeacon/N = locate() in T
if(N)
home = T
homeName = N.location
else
homeName = "Unset"
suffix = num2text(++amount) // Starts from 1
name = "Mulebot #[suffix]"
/mob/living/bot/mulebot/MouseDrop_T(var/atom/movable/C, var/mob/user)
if(user.stat)
return
if(!istype(C) || C.anchored || get_dist(user, src) > 1 || get_dist(src, C) > 1 )
return
load(C)
/mob/living/bot/mulebot/attack_hand(var/mob/user)
interact(user)
/mob/living/bot/mulebot/proc/interact(var/mob/user)
var/dat
dat += "<TT><B>Multiple Utility Load Effector Mk. III</B></TT><BR><BR>"
dat += "ID: [suffix]<BR>"
dat += "Power: [on ? "On" : "Off"]<BR>"
if(!open)
dat += "Status: "
switch(mode)
if(MULE_IDLE)
dat += "Ready"
if(MULE_MOVING, MULE_UNLOAD, MULE_PATH_DONE)
dat += "Navigating"
if(MULE_UNLOAD)
dat += "Unloading"
if(MULE_LOST)
dat += "Processing commands"
if(MULE_CALC_MIN to MULE_CALC_MAX)
dat += "Calculating navigation path"
dat += "<BR>Current Load: [load ? load.name : "<i>none</i>"]<BR>"
if(locked)
dat += "<HR>Controls are locked"
else
dat += "<HR>Controls are unlocked<BR><BR>"
if(!locked || issilicon(user))
dat += "<A href='byond://?src=\ref[src];op=power'>Toggle power</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=stop'>Stop</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=go'>Proceed</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=home'>Return to home</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=destination'>Set destination</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=sethome'>Set home</A><BR>"
dat += "<A href='byond://?src=\ref[src];op=autoret'>Toggle auto return home</A> ([auto_return ? "On" : "Off"])<BR>"
dat += "<A href='byond://?src=\ref[src];op=cargotypes'>Toggle non-standard cargo</A> ([crates_only ? "Off" : "On"])<BR>"
if(load)
dat += "<A href='byond://?src=\ref[src];op=unload'>Unload now</A><BR>"
dat += "<HR>The maintenance hatch is closed.<BR>"
else
if(!issilicon(user))
dat += "The maintenance hatch is open.<BR><BR>"
dat += "<A href='byond://?src=\ref[src];op=safety'>Toggle safety</A> ([safety ? "On" : "Off - DANGER"])<BR>"
else
dat += "The bot is in maintenance mode and cannot be controlled.<BR>"
user << browse("<HEAD><TITLE>Mulebot [suffix ? "([suffix])" : ""]</TITLE></HEAD>[dat]", "window=mulebot;size=350x500")
onclose(user, "mulebot")
return
/mob/living/bot/mulebot/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
add_fingerprint(usr)
switch(href_list["op"])
if("power")
if(on)
turn_off()
else
turn_on()
visible_message("[usr] switches [on ? "on" : "off"] [src].")
if("stop")
obeyCommand("Stop")
if("go")
obeyCommand("GoTD")
if("home")
obeyCommand("Home")
if("destination")
obeyCommand("SetD")
if("sethome")
var/new_dest
var/list/beaconlist = new()
for(var/obj/machinery/navbeacon/N in navbeacons)
beaconlist.Add(N.location)
beaconlist[N.location] = N
if(beaconlist.len)
new_dest = input("Select new home tag", "Mulebot [suffix ? "([suffix])" : ""]", null) in null|beaconlist
else
alert("No destination beacons available.")
if(new_dest)
home = get_turf(beaconlist[new_dest])
homeName = new_dest
if("unload")
unload()
if("autoret")
auto_return = !auto_return
if("cargotypes")
crates_only = !crates_only
if("safety")
safety = !safety
interact(usr)
/mob/living/bot/mulebot/attackby(var/obj/item/O, var/mob/user)
..()
update_icons()
/mob/living/bot/mulebot/proc/obeyCommand(var/command)
switch(command)
if("Home")
mode = MULE_IDLE
target = home
targetName = "Home"
mode = MULE_LOST
if("SetD")
var/new_dest
var/list/beaconlist = new()
for(var/obj/machinery/navbeacon/N in navbeacons)
beaconlist.Add(N.location)
beaconlist[N.location] = N
if(beaconlist.len)
new_dest = input("Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]") in null|beaconlist
else
alert("No destination beacons available.")
if(new_dest)
target = get_turf(beaconlist[new_dest])
targetName = new_dest
if("GoTD")
if(mode == MULE_IDLE)
mode = MULE_LOST
if("Stop")
mode = MULE_IDLE
/mob/living/bot/mulebot/emag_act(var/remaining_charges, var/user)
locked = !locked
user << "<span class='notice'>You [locked ? "lock" : "unlock"] the mulebot's controls!</span>"
flick("mulebot-emagged", src)
playsound(loc, 'sound/effects/sparks1.ogg', 100, 0)
return 1
/mob/living/bot/mulebot/update_icons()
if(open)
icon_state = "mulebot-hatch"
return
if(mode == MULE_MOVING || mode == MULE_UNLOAD)
icon_state = "mulebot1"
return
icon_state = "mulebot0"
/mob/living/bot/mulebot/Life()
..()
if(busy)
return
if(!safety && prob(1))
flick("mulebot-emagged", src)
switch(mode)
if(MULE_IDLE) // Idle
return
if(MULE_MOVING) // Moving to target
if(!target) // Return home
if(auto_return && home)
target = home
targetName = "Home"
mode = MULE_LOST
else
mode = MULE_IDLE
update_icons()
return
if(loc == target) // Unload or stop
custom_emote(2, "makes a chiming sound.")
playsound(loc, 'sound/machines/chime.ogg', 50, 0)
mode = MULE_UNLOAD
update_icons()
return
if(path.len) // Move
makeStep()
sleep(10)
if(path.len)
makeStep()
else
mode = MULE_LOST
update_icons()
return
if(MULE_UNLOAD)
unload(dir)
if(auto_return && home && (loc != home))
target = home
targetName = "Home"
mode = MULE_LOST
else
mode = MULE_IDLE
update_icons()
return
if(MULE_LOST) // Lost my way
if(target)
spawn(0)
calc_path(obstacle)
mode = MULE_CALC_MIN
else
mode = MULE_IDLE
update_icons()
return
if(MULE_CALC_MIN to MULE_CALC_MAX) // Calcing path
if(path.len)
mode = MULE_PATH_DONE
update_icons()
else
++mode
return
if(MULE_PATH_DONE) // Done with path
obstacle = null
if(path.len)
frustration = 0
mode = MULE_MOVING
else
if(home)
target = home
targetName = "Home"
mode = MULE_LOST
else
mode = MULE_IDLE
update_icons()
/mob/living/bot/mulebot/Bump(var/mob/living/M)
if(!safety && istype(M))
visible_message("<span class='warning'>[src] knocks over [M]!</span>")
M.Stun(8)
M.Weaken(5)
..()
/mob/living/bot/mulebot/proc/makeStep()
var/turf/next = path[1]
if(next == loc)
path -= next
return
var/moved = step_towards(src, next)
if(moved)
frustration = 0
path -= next
else if(frustration < 6)
if(frustration == 3)
custom_emote(2, "makes an annoyed buzzing sound")
playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
++frustration
else
custom_emote(2, "makes a sighing buzz.")
playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
obstacle = next
mode = MULE_LOST
/mob/living/bot/mulebot/proc/runOver(var/mob/living/carbon/human/H)
if(istype(H)) // No safety checks - WILL run over lying humans. Stop ERPing in the maint!
visible_message("<span class='warning'>[src] drives over [H]!</span>")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/damage = rand(5, 7)
H.apply_damage(2 * damage, BRUTE, BP_HEAD)
H.apply_damage(2 * damage, BRUTE, BP_TORSO)
H.apply_damage(0.5 * damage, BRUTE, BP_L_LEG)
H.apply_damage(0.5 * damage, BRUTE, BP_R_LEG)
H.apply_damage(0.5 * damage, BRUTE, BP_L_ARM)
H.apply_damage(0.5 * damage, BRUTE, BP_R_ARM)
blood_splatter(src, H, 1)
..()
/mob/living/bot/mulebot/relaymove(var/mob/user, var/direction)
if(load == user)
unload(direction)
/mob/living/bot/mulebot/explode()
unload(pick(0, 1, 2, 4, 8))
visible_message("<span class='danger'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
new /obj/item/device/assembly/prox_sensor(Tsec)
PoolOrNew(/obj/item/stack/rods, Tsec)
PoolOrNew(/obj/item/stack/rods, Tsec)
new /obj/item/stack/cable_coil/cut(Tsec)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
new /obj/effect/decal/cleanable/blood/oil(Tsec)
..()
/mob/living/bot/mulebot/proc/calc_path(var/turf/avoid = null)
path = AStar(loc, target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 250, id = botcard, exclude = avoid)
if(!path)
path = list()
/mob/living/bot/mulebot/proc/load(var/atom/movable/C)
if(busy || load || get_dist(C, src) > 1 || !isturf(C.loc))
return
for(var/obj/structure/plasticflaps/P in src.loc)//Takes flaps into account
if(!CanPass(C,P))
return
if(crates_only && !istype(C,/obj/structure/closet/crate))
custom_emote(2, "makes a sighing buzz.")
playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
return
var/obj/structure/closet/crate/crate = C
if(istype(crate))
crate.close()
//I'm sure someone will come along and ask why this is here... well people were dragging screen items onto the mule, and that was not cool.
//So this is a simple fix that only allows a selection of item types to be considered. Further narrowing-down is below.
//if(!istype(C,/obj/item) && !istype(C,/obj/machinery) && !istype(C,/obj/structure) && !ismob(C))
// return
busy = 1
C.loc = loc
sleep(2)
if(C.loc != loc) //To prevent you from going onto more than one bot.
return
C.loc = src
load = C
C.pixel_y += 9
if(C.layer < layer)
C.layer = layer + 0.1
overlays += C
busy = 0
/mob/living/bot/mulebot/proc/unload(var/dirn = 0)
if(!load || busy)
return
busy = 1
overlays.Cut()
load.loc = loc
load.pixel_y -= 9
load.layer = initial(load.layer)
if(dirn)
step(load, dirn)
load = null
for(var/atom/movable/AM in src)
if(AM == botcard || AM == access_scanner)
continue
AM.loc = loc
AM.layer = initial(AM.layer)
AM.pixel_y = initial(AM.pixel_y)
busy = 0
#undef MULE_IDLE
#undef MULE_MOVING
#undef MULE_UNLOAD
#undef MULE_LOST
#undef MULE_CALC_MIN
#undef MULE_CALC_MAX
#undef MULE_PATH_DONE
@@ -1,14 +0,0 @@
/mob/living/carbon/alien/larva
name = "alien larva"
real_name = "alien larva"
adult_form = /mob/living/carbon/human
speak_emote = list("hisses")
icon_state = "larva"
language = "Hivemind"
maxHealth = 25
health = 25
/mob/living/carbon/alien/larva/New()
..()
add_language("Xenomorph") //Bonus language.
internal_organs |= new /obj/item/organ/internal/xenos/hivenode(src)
@@ -1,12 +0,0 @@
//Larvae regenerate health and nutrition from plasma and alien weeds.
/mob/living/carbon/alien/larva/handle_environment(var/datum/gas_mixture/environment)
if(!environment) return
var/turf/T = get_turf(src)
if(environment.gas["phoron"] > 0 || (T && locate(/obj/effect/alien/weeds) in T.contents))
update_progression()
adjustBruteLoss(-1)
adjustFireLoss(-1)
adjustToxLoss(-1)
adjustOxyLoss(-1)
@@ -1,12 +0,0 @@
/mob/living/carbon/alien/larva/confirm_evolution()
src << "\blue <b>You are growing into a beautiful alien! It is time to choose a caste.</b>"
src << "\blue There are three to choose from:"
src << "<B>Hunters</B> \blue are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
src << "<B>Sentinels</B> \blue are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters."
src << "<B>Drones</B> \blue are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen."
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
return alien_caste ? "Xenomorph [alien_caste]" : null
/mob/living/carbon/alien/larva/show_evolution_blurb()
return
@@ -71,10 +71,6 @@
stat("Tank Pressure", internal.air_contents.return_pressure())
stat("Distribution Pressure", internal.distribute_pressure)
var/obj/item/organ/internal/xenos/plasmavessel/P = internal_organs_by_name[O_PLASMA]
if(P)
stat(null, "Phoron Stored: [P.stored_plasma]/[P.max_plasma]")
if(back && istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/suit = back
var/cell_status = "ERROR"
@@ -235,9 +231,9 @@
// called when something steps onto a human
// this handles mulebots and vehicles
/mob/living/carbon/human/Crossed(var/atom/movable/AM)
if(istype(AM, /obj/machinery/bot/mulebot))
var/obj/machinery/bot/mulebot/MB = AM
MB.RunOver(src)
if(istype(AM, /mob/living/bot/mulebot))
var/mob/living/bot/mulebot/MB = AM
MB.runOver(src)
if(istype(AM, /obj/vehicle))
var/obj/vehicle/V = AM
@@ -49,116 +49,6 @@
if ((O.client && !( O.blinded )))
O.show_message(text("\red <B>[] [failed ? "tried to tackle" : "has tackled"] down []!</B>", src, T), 1)
/mob/living/carbon/human/proc/leap()
set category = "Abilities"
set name = "Leap"
set desc = "Leap at a target and grab them aggressively."
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot leap in your current state."
return
var/list/choices = list()
for(var/mob/living/M in view(6,src))
if(!istype(M,/mob/living/silicon))
choices += M
choices -= src
var/mob/living/T = input(src,"Who do you wish to leap at?") as null|anything in choices
if(!T || !src || src.stat) return
if(get_dist(get_turf(T), get_turf(src)) > 4) return
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot leap in your current state."
return
last_special = world.time + 75
status_flags |= LEAPING
src.visible_message("<span class='danger'>\The [src] leaps at [T]!</span>")
src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src)
playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1)
sleep(5)
if(status_flags & LEAPING) status_flags &= ~LEAPING
if(!src.Adjacent(T))
src << "<span class='warning'>You miss!</span>"
return
T.Weaken(3)
// Pariahs are not good at leaping. This is snowflakey, pls fix.
if(species.name == "Vox Pariah")
src.Weaken(5)
return
var/use_hand = "left"
if(l_hand)
if(r_hand)
src << "<span class='danger'>You need to have one hand free to grab someone.</span>"
return
else
use_hand = "right"
src.visible_message("<span class='warning'><b>\The [src]</b> seizes [T] aggressively!</span>")
var/obj/item/weapon/grab/G = new(src,T)
if(use_hand == "left")
l_hand = G
else
r_hand = G
G.state = GRAB_PASSIVE
G.icon_state = "grabbed1"
G.synch()
/mob/living/carbon/human/proc/gut()
set category = "Abilities"
set name = "Gut"
set desc = "While grabbing someone aggressively, rip their guts out or tear them apart."
if(last_special > world.time)
return
if(stat || paralysis || stunned || weakened || lying)
src << "\red You cannot do that in your current state."
return
var/obj/item/weapon/grab/G = locate() in src
if(!G || !istype(G))
src << "\red You are not grabbing anyone."
return
if(G.state < GRAB_AGGRESSIVE)
src << "\red You must have an aggressive grab to gut your prey!"
return
last_special = world.time + 50
visible_message("<span class='warning'><b>\The [src]</b> rips viciously at \the [G.affecting]'s body with its claws!</span>")
if(istype(G.affecting,/mob/living/carbon/human))
var/mob/living/carbon/human/H = G.affecting
H.apply_damage(50,BRUTE)
if(H.stat == 2)
H.gib()
else
var/mob/living/M = G.affecting
if(!istype(M)) return //wut
M.apply_damage(50,BRUTE)
if(M.stat == 2)
M.gib()
/mob/living/carbon/human/proc/commune()
set category = "Abilities"
set name = "Commune with creature"
@@ -14,10 +14,6 @@
h_style = "Unathi Horns"
..(new_loc, "Unathi")
/mob/living/carbon/human/vox/New(var/new_loc)
h_style = "Short Vox Quills"
..(new_loc, "Vox")
/mob/living/carbon/human/diona/New(var/new_loc)
..(new_loc, "Diona")
@@ -1,142 +0,0 @@
/datum/species/vox
name = "Vox"
name_plural = "Vox"
icobase = 'icons/mob/human_races/r_vox.dmi'
deform = 'icons/mob/human_races/r_def_vox.dmi'
default_language = "Vox-pidgin"
language = "Galactic Common"
num_alternate_languages = 1
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong)
rarity_value = 4
blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \
scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \
alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \
refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
smell.<br/><br/>Most humans will never meet a Vox raider, instead learning of this insular species through \
dealing with their traders and merchants; those that do rarely enjoy the experience."
speech_sounds = list('sound/voice/shriek1.ogg')
speech_chance = 20
warning_low_pressure = 50
hazard_low_pressure = 0
cold_level_1 = 80
cold_level_2 = 50
cold_level_3 = 0
gluttonous = 2
breath_type = "nitrogen"
poison_type = "oxygen"
siemens_coefficient = 0.2
flags = NO_SCAN | NO_MINOR_CUT
spawn_flags = CAN_JOIN | IS_WHITELISTED
appearance_flags = HAS_EYE_COLOR
blood_color = "#2299FC"
flesh_color = "#808D11"
reagent_tag = IS_VOX
inherent_verbs = list(
/mob/living/carbon/human/proc/leap
)
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/vox),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes,
"stack" = /obj/item/organ/internal/stack/vox
)
/datum/species/vox/get_random_name(var/gender)
var/datum/language/species_language = all_languages[default_language]
return species_language.get_random_name(gender)
/datum/species/vox/equip_survival_gear(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H), slot_r_hand)
H.internal = H.back
else
H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H.back), slot_in_backpack)
H.internal = H.r_hand
H.internals.icon_state = "internal1"
/datum/species/vox/get_station_variant()
return "Vox Pariah"
// Joining as a station vox will give you this template, hence IS_RESTRICTED flag.
/datum/species/vox/pariah
name = "Vox Pariah"
rarity_value = 0.1
speech_chance = 60 // No volume control.
siemens_coefficient = 0.5 // Ragged scaleless patches.
warning_low_pressure = (WARNING_LOW_PRESSURE-20)
hazard_low_pressure = (HAZARD_LOW_PRESSURE-10)
total_health = 80
cold_level_1 = 130
cold_level_2 = 100
cold_level_3 = 60
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite)
// Pariahs have no stack.
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/pariah_brain,
O_EYES = /obj/item/organ/internal/eyes
)
flags = IS_RESTRICTED | NO_SCAN | HAS_EYE_COLOR
// No combat skills for you.
/datum/species/vox/pariah/can_shred(var/mob/living/carbon/human/H, var/ignore_intent)
return 0
// Pariahs are really gross.
/datum/species/vox/pariah/handle_environment_special(var/mob/living/carbon/human/H)
if(prob(5))
var/stink_range = rand(3,5)
for(var/mob/living/M in range(H,stink_range))
if(M.stat || M == H)
continue
var/mob/living/carbon/human/target = M
if(istype(target))
if(target.internals)
continue
if(target.head && (target.head.body_parts_covered & FACE) && (target.head.flags & AIRTIGHT))
continue
if(target.wear_mask && (target.wear_mask.body_parts_covered & FACE) && (target.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))
continue
M << "<span class='danger'>A terrible stench emanates from \the [H].</span>"
/datum/species/vox/pariah/get_bodytype()
return "Vox"
@@ -1,159 +0,0 @@
// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
/obj/item/alien_embryo
name = "alien embryo"
desc = "All slimy and yuck."
icon = 'icons/mob/alien.dmi'
icon_state = "larva0_dead"
var/mob/living/affected_mob
var/stage = 0
/obj/item/alien_embryo/New()
if(istype(loc, /mob/living))
affected_mob = loc
processing_objects.Add(src)
spawn(0)
AddInfectionImages(affected_mob)
else
qdel(src)
/obj/item/alien_embryo/Destroy()
if(affected_mob)
affected_mob.status_flags &= ~(XENO_HOST)
spawn(0)
RemoveInfectionImages(affected_mob)
..()
/obj/item/alien_embryo/process()
if(!affected_mob) return
if(loc != affected_mob)
affected_mob.status_flags &= ~(XENO_HOST)
processing_objects.Remove(src)
spawn(0)
RemoveInfectionImages(affected_mob)
affected_mob = null
return
if(stage < 5 && prob(3))
stage++
spawn(0)
RefreshInfectionImage(affected_mob)
switch(stage)
if(2, 3)
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
affected_mob << "\red Your throat feels sore."
if(prob(1))
affected_mob << "\red Mucous runs down the back of your throat."
if(4)
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(2))
affected_mob << "\red Your muscles ache."
if(prob(20))
affected_mob.take_organ_damage(1)
if(prob(2))
affected_mob << "\red Your stomach hurts."
if(prob(20))
affected_mob.adjustToxLoss(1)
affected_mob.updatehealth()
if(5)
affected_mob << "\red You feel something tearing its way out of your stomach..."
affected_mob.adjustToxLoss(10)
affected_mob.updatehealth()
if(prob(50))
AttemptGrow()
/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
var/list/candidates = get_alien_candidates()
var/picked = null
// To stop clientless larva, we will check that our host has a client
// if we find no ghosts to become the alien. If the host has a client
// he will become the alien but if he doesn't then we will set the stage
// to 2, so we don't do a process heavy check everytime.
if(candidates.len)
picked = pick(candidates)
else if(affected_mob.client)
picked = affected_mob.key
else
stage = 4 // Let's try again later.
return
if(affected_mob.lying)
affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_lie")
else
affected_mob.overlays += image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "burst_stand")
spawn(6)
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
new_xeno.key = picked
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
if(gib_on_success)
affected_mob.gib()
qdel(src)
/*----------------------------------------
Proc: RefreshInfectionImage()
Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens.
----------------------------------------*/
/obj/item/alien_embryo/proc/RefreshInfectionImage()
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
for(var/image/I in alien.client.images)
if(dd_hasprefix_case(I.icon_state, "infected"))
qdel(I)
for(var/mob/living/L in mob_list)
if(iscorgi(L) || iscarbon(L))
if(L.status_flags & XENO_HOST)
var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[stage]")
alien.client.images += I
/*----------------------------------------
Proc: AddInfectionImages(C)
Des: Checks if the passed mob (C) is infected with the alien egg, then gives each alien client an infected image at C.
----------------------------------------*/
/obj/item/alien_embryo/proc/AddInfectionImages(var/mob/living/C)
if(C)
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
if(C.status_flags & XENO_HOST)
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]")
alien.client.images += I
/*----------------------------------------
Proc: RemoveInfectionImage(C)
Des: Removes the alien infection image from all aliens in the world located in passed mob (C).
----------------------------------------*/
/obj/item/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C)
if(C)
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
for(var/image/I in alien.client.images)
if(I.loc == C)
if(dd_hasprefix_case(I.icon_state, "infected"))
qdel(I)
@@ -1,231 +0,0 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
//TODO: Make these simple_animals
var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone
var/const/MAX_IMPREGNATION_TIME = 150
var/const/MIN_ACTIVE_TIME = 200 //time between being dropped and going idle
var/const/MAX_ACTIVE_TIME = 400
/obj/item/clothing/mask/facehugger
name = "alien"
desc = "It has some sort of a tube at the end of its tail."
icon = 'icons/mob/alien.dmi'
icon_state = "facehugger"
item_state = "facehugger"
w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4
flags = PROXMOVE
body_parts_covered = FACE|EYES
throw_range = 5
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
var/sterile = 0
var/strength = 5
var/attached = 0
/obj/item/clothing/mask/facehugger/attack_hand(user as mob)
if((stat == CONSCIOUS && !sterile))
if(Attach(user))
return
..()
/obj/item/clothing/mask/facehugger/attack(mob/living/M as mob, mob/user as mob)
..()
user.drop_from_inventory(src)
Attach(M)
/obj/item/clothing/mask/facehugger/New()
if(config.aliens_allowed)
..()
else
qdel(src)
/obj/item/clothing/mask/facehugger/examine(mob/user)
..(user)
switch(stat)
if(DEAD,UNCONSCIOUS)
user << "\red \b [src] is not moving."
if(CONSCIOUS)
user << "\red \b [src] seems to be active."
if (sterile)
user << "\red \b It looks like the proboscis has been removed."
return
/obj/item/clothing/mask/facehugger/attackby(obj/item/I, mob/user)
if(I.force)
user.do_attack_animation(src)
Die()
return
/obj/item/clothing/mask/facehugger/bullet_act()
Die()
return
/obj/item/clothing/mask/facehugger/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > T0C+80)
Die()
return
/obj/item/clothing/mask/facehugger/equipped(mob/M)
..()
Attach(M)
/obj/item/clothing/mask/facehugger/Crossed(atom/target)
HasProximity(target)
return
/obj/item/clothing/mask/facehugger/on_found(mob/finder as mob)
if(stat == CONSCIOUS)
HasProximity(finder)
return 1
return
/obj/item/clothing/mask/facehugger/HasProximity(atom/movable/AM as mob|obj)
if(CanHug(AM))
Attach(AM)
/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed)
..()
if(stat == CONSCIOUS)
icon_state = "[initial(icon_state)]_thrown"
spawn(15)
if(icon_state == "[initial(icon_state)]_thrown")
icon_state = "[initial(icon_state)]"
/obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom)
..()
if(stat == CONSCIOUS)
icon_state = "[initial(icon_state)]"
throwing = 0
GoIdle(30,100) //stunned for a few seconds - allows throwing them to be useful for positioning but not as an offensive action (unless you're setting up a trap)
/obj/item/clothing/mask/facehugger/proc/Attach(M as mob)
if((!iscorgi(M) && !iscarbon(M)))
return
if(attached)
return
var/mob/living/carbon/C = M
if(istype(C) && locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs)
return
attached++
spawn(MAX_IMPREGNATION_TIME)
attached = 0
var/mob/living/L = M //just so I don't need to use :
if(loc == L) return
if(stat != CONSCIOUS) return
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
L.visible_message("\red \b [src] leaps at [L]'s face!")
if(iscarbon(M))
var/mob/living/carbon/target = L
if(target.wear_mask)
if(prob(20)) return
var/obj/item/clothing/W = target.wear_mask
if(!W.canremove) return
target.drop_from_inventory(W)
target.visible_message("\red \b [src] tears [W] off of [target]'s face!")
target.equip_to_slot(src, slot_wear_mask)
target.contents += src // Monkey sanity check - Snapshot
if(!sterile) L.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
else if (iscorgi(M))
var/mob/living/simple_animal/corgi/corgi = M
src.loc = corgi
corgi.facehugger = src
corgi.wear_mask = src
//C.regenerate_icons()
GoIdle() //so it doesn't jump the people that tear it off
spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME))
Impregnate(L)
return
/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob)
if(!target || target.wear_mask != src || target.stat == DEAD) //was taken off or something
return
if(!sterile)
new /obj/item/alien_embryo(target)
target.status_flags |= XENO_HOST
target.visible_message("\red \b [src] falls limp after violating [target]'s face!")
Die()
icon_state = "[initial(icon_state)]_impregnated"
if(iscorgi(target))
var/mob/living/simple_animal/corgi/C = target
src.loc = get_turf(C)
C.facehugger = null
else
target.visible_message("\red \b [src] violates [target]'s face!")
return
/obj/item/clothing/mask/facehugger/proc/GoActive()
if(stat == DEAD || stat == CONSCIOUS)
return
stat = CONSCIOUS
icon_state = "[initial(icon_state)]"
return
/obj/item/clothing/mask/facehugger/proc/GoIdle(var/min_time=MIN_ACTIVE_TIME, var/max_time=MAX_ACTIVE_TIME)
if(stat == DEAD || stat == UNCONSCIOUS)
return
/* RemoveActiveIndicators() */
stat = UNCONSCIOUS
icon_state = "[initial(icon_state)]_inactive"
spawn(rand(min_time,max_time))
GoActive()
return
/obj/item/clothing/mask/facehugger/proc/Die()
if(stat == DEAD)
return
/* RemoveActiveIndicators() */
icon_state = "[initial(icon_state)]_dead"
stat = DEAD
src.visible_message("\red \b[src] curls up into a ball!")
return
/proc/CanHug(var/mob/M)
if(iscorgi(M))
return 1
if(!iscarbon(M))
return 0
var/mob/living/carbon/C = M
if(istype(C) && locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs)
return 0
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(H.head && (H.head.body_parts_covered & FACE) && !(H.head.item_flags & FLEXIBLEMATERIAL))
return 0
return 1
@@ -1,222 +0,0 @@
/proc/alien_queen_exists(var/ignore_self,var/mob/living/carbon/human/self)
for(var/mob/living/carbon/human/Q in living_mob_list)
if(self && ignore_self && self == Q)
continue
if(Q.species.name != "Xenomorph Queen")
continue
if(!Q.key || !Q.client || Q.stat)
continue
return 1
return 0
/mob/living/carbon/human/proc/gain_plasma(var/amount)
var/obj/item/organ/internal/xenos/plasmavessel/I = internal_organs_by_name[O_PLASMA]
if(!istype(I)) return
if(amount)
I.stored_plasma += amount
I.stored_plasma = max(0,min(I.stored_plasma,I.max_plasma))
/mob/living/carbon/human/proc/check_alien_ability(var/cost,var/needs_foundation,var/needs_organ)
var/obj/item/organ/internal/xenos/plasmavessel/P = internal_organs_by_name[O_PLASMA]
if(!istype(P))
src << "<span class='danger'>Your plasma vessel has been removed!</span>"
return
if(needs_organ)
var/obj/item/organ/internal/I = internal_organs_by_name[needs_organ]
if(!I)
src << "<span class='danger'>Your [needs_organ] has been removed!</span>"
return
else if((I.status & ORGAN_CUT_AWAY) || I.is_broken())
src << "<span class='danger'>Your [needs_organ] is too damaged to function!</span>"
return
if(P.stored_plasma < cost)
src << "\red You don't have enough phoron stored to do that."
return 0
if(needs_foundation)
var/turf/T = get_turf(src)
var/has_foundation
if(T)
//TODO: Work out the actual conditions this needs.
if(!(istype(T,/turf/space)))
has_foundation = 1
if(!has_foundation)
src << "\red You need a solid foundation to do that on."
return 0
P.stored_plasma -= cost
return 1
// Free abilities.
/mob/living/carbon/human/proc/transfer_plasma(mob/living/carbon/human/M as mob in oview())
set name = "Transfer Plasma"
set desc = "Transfer Plasma to another alien"
set category = "Abilities"
if (get_dist(src,M) <= 1)
src << "<span class='alium'>You need to be closer.</span>"
return
var/obj/item/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name[O_PLASMA]
if(!istype(I))
src << "<span class='alium'>Their plasma vessel is missing.</span>"
return
var/amount = input("Amount:", "Transfer Plasma to [M]") as num
if (amount)
amount = abs(round(amount))
if(check_alien_ability(amount,0,O_PLASMA))
M.gain_plasma(amount)
M << "<span class='alium'>[src] has transfered [amount] plasma to you.</span>"
src << "<span class='alium'>You have transferred [amount] plasma to [M].</span>"
return
// Queen verbs.
/mob/living/carbon/human/proc/lay_egg()
set name = "Lay Egg (75)"
set desc = "Lay an egg to produce huggers to impregnate prey with."
set category = "Abilities"
if(!config.aliens_allowed)
src << "You begin to lay an egg, but hesitate. You suspect it isn't allowed."
verbs -= /mob/living/carbon/human/proc/lay_egg
return
if(locate(/obj/effect/alien/egg) in get_turf(src))
src << "There's already an egg here."
return
if(check_alien_ability(75,1,O_EGG))
visible_message("<span class='alium'><B>[src] has laid an egg!</B></span>")
new /obj/effect/alien/egg(loc)
return
// Drone verbs.
/mob/living/carbon/human/proc/evolve()
set name = "Evolve (500)"
set desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time."
set category = "Abilities"
if(alien_queen_exists())
src << "<span class='notice'>We already have an active queen.</span>"
return
if(check_alien_ability(500))
visible_message("<span class='alium'><B>[src] begins to twist and contort!</B></span>", "<span class='alium'>You begin to evolve!</span>")
src.set_species("Xenomorph Queen")
return
/mob/living/carbon/human/proc/plant()
set name = "Plant Weeds (50)"
set desc = "Plants some alien weeds"
set category = "Abilities"
if(check_alien_ability(50,1,O_RESIN))
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
new /obj/effect/alien/weeds/node(loc)
return
/mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N
set name = "Corrosive Acid (200)"
set desc = "Drench an object in acid, destroying it over time."
set category = "Abilities"
if(!O in oview(1))
src << "<span class='alium'>[O] is too far away.</span>"
return
// OBJ CHECK
var/cannot_melt
if(isobj(O))
var/obj/I = O
if(I.unacidable)
cannot_melt = 1
else
if(istype(O, /turf/simulated/wall))
var/turf/simulated/wall/W = O
if(W.material.flags & MATERIAL_UNMELTABLE)
cannot_melt = 1
else if(istype(O, /turf/simulated/floor))
var/turf/simulated/floor/F = O
if(F.flooring && (F.flooring.flags & TURF_ACID_IMMUNE))
cannot_melt = 1
if(cannot_melt)
src << "<span class='alium'>You cannot dissolve this object.</span>"
return
if(check_alien_ability(200,0,O_ACID))
new /obj/effect/alien/acid(get_turf(O), O)
visible_message("<span class='alium'><B>[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!</B></span>")
return
/mob/living/carbon/human/proc/neurotoxin(mob/target as mob in oview())
set name = "Spit Neurotoxin (50)"
set desc = "Spits neurotoxin at someone, paralyzing them for a short time if they are not wearing protective gear."
set category = "Abilities"
if(!check_alien_ability(50,0,O_ACID))
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot spit neurotoxin in your current state."
return
visible_message("<span class='warning'>[src] spits neurotoxin at [target]!</span>", "<span class='alium'>You spit neurotoxin at [target].</span>")
//I'm not motivated enough to revise this. Prjectile code in general needs update.
// Maybe change this to use throw_at? ~ Z
var/turf/T = loc
var/turf/U = (istype(target, /atom/movable) ? target.loc : target)
if(!U || !T)
return
while(U && !istype(U,/turf))
U = U.loc
if(!istype(T, /turf))
return
if (U == T)
usr.bullet_act(new /obj/item/projectile/energy/neurotoxin(usr.loc), get_organ_target())
return
if(!istype(U, /turf))
return
var/obj/item/projectile/energy/neurotoxin/A = new /obj/item/projectile/energy/neurotoxin(usr.loc)
A.current = U
A.yo = U.y - T.y
A.xo = U.x - T.x
A.process()
return
/mob/living/carbon/human/proc/resin() // -- TLE
set name = "Secrete Resin (75)"
set desc = "Secrete tough malleable resin."
set category = "Abilities"
var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist
if(!choice)
return
if(!check_alien_ability(75,1,O_RESIN))
return
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
switch(choice)
if("resin door")
new /obj/structure/simple_door/resin(loc)
if("resin wall")
new /obj/effect/alien/resin/wall(loc)
if("resin membrane")
new /obj/effect/alien/resin/membrane(loc)
if("resin nest")
new /obj/structure/bed/nest(loc)
return
@@ -1,326 +0,0 @@
//Stand-in until this is made more lore-friendly.
/datum/species/xenos
name = "Xenomorph"
name_plural = "Xenomorphs"
default_language = "Xenomorph"
language = "Hivemind"
unarmed_types = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong)
hud_type = /datum/hud_data/alien
rarity_value = 3
has_fine_manipulation = 0
siemens_coefficient = 0
gluttonous = 3
brute_mod = 0.5 // Hardened carapace.
burn_mod = 2 // Weak to fire.
warning_low_pressure = 50
hazard_low_pressure = -1
cold_level_1 = 50
cold_level_2 = -1
cold_level_3 = -1
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT
spawn_flags = IS_RESTRICTED
reagent_tag = IS_XENOS
blood_color = "#05EE05"
flesh_color = "#282846"
gibbed_anim = "gibbed-a"
dusted_anim = "dust-a"
death_message = "lets out a waning guttural screech, green blood bubbling from its maw."
death_sound = 'sound/voice/hiss6.ogg'
speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
speech_chance = 100
breath_type = null
poison_type = null
vision_flags = SEE_SELF|SEE_MOBS
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
bump_flag = ALIEN
swap_flags = ~HEAVY
push_flags = (~HEAVY) ^ ROBOT
var/alien_number = 0
var/caste_name = "creature" // Used to update alien name.
var/weeds_heal_rate = 1 // Health regen on weeds.
var/weeds_plasma_rate = 5 // Plasma regen on weeds.
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/no_eyes),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
/datum/species/xenos/get_bodytype()
return "Xenomorph"
/datum/species/xenos/get_random_name()
return "alien [caste_name] ([alien_number])"
/datum/species/xenos/can_understand(var/mob/other)
if(istype(other,/mob/living/carbon/alien/larva))
return 1
return 0
/datum/species/xenos/hug(var/mob/living/carbon/human/H,var/mob/living/target)
H.visible_message("<span class='notice'>[H] caresses [target] with its scythe-like arm.</span>", \
"<span class='notice'>You caress [target] with your scythe-like arm.</span>")
/datum/species/xenos/handle_post_spawn(var/mob/living/carbon/human/H)
if(H.mind)
H.mind.assigned_role = "Alien"
H.mind.special_role = "Alien"
alien_number++ //Keep track of how many aliens we've had so far.
H.real_name = "alien [caste_name] ([alien_number])"
H.name = H.real_name
..()
/datum/species/xenos/handle_environment_special(var/mob/living/carbon/human/H)
var/turf/T = H.loc
if(!T) return
var/datum/gas_mixture/environment = T.return_air()
if(!environment) return
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
if(!regenerate(H))
var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
P.stored_plasma += weeds_plasma_rate
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
..()
/datum/species/xenos/proc/regenerate(var/mob/living/carbon/human/H)
var/heal_rate = weeds_heal_rate
var/mend_prob = 10
if (!H.resting)
heal_rate = weeds_heal_rate / 3
mend_prob = 1
//first heal damages
if (H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
if (prob(5))
H << "<span class='alium'>You feel a soothing sensation come over you...</span>"
return 1
//next internal organs
for(var/obj/item/organ/I in H.internal_organs)
if(I.damage > 0)
I.damage = max(I.damage - heal_rate, 0)
if (prob(5))
H << "<span class='alium'>You feel a soothing sensation within your [I.parent_organ]...</span>"
return 1
//next mend broken bones, approx 10 ticks each
for(var/obj/item/organ/external/E in H.bad_external_organs)
if (E.status & ORGAN_BROKEN)
if (prob(mend_prob))
if (E.mend_fracture())
H << "<span class='alium'>You feel something mend itself inside your [E.name].</span>"
return 1
return 0
/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H)
H.AddInfectionImages()
..()
/datum/species/xenos/handle_logout_special(var/mob/living/carbon/human/H)
H.RemoveInfectionImages()
..()
/datum/species/xenos/drone
name = "Xenomorph Drone"
caste_name = "drone"
weeds_plasma_rate = 15
slowdown = 1
tail = "xenos_drone_tail"
rarity_value = 5
icobase = 'icons/mob/human_races/xenos/r_xenos_drone.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_drone.dmi'
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/queen,
O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/plant,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/evolve,
/mob/living/carbon/human/proc/resin,
/mob/living/carbon/human/proc/corrosive_acid
)
/datum/species/xenos/drone/handle_post_spawn(var/mob/living/carbon/human/H)
var/mob/living/carbon/human/A = H
if(!istype(A))
return ..()
..()
/datum/species/xenos/hunter
name = "Xenomorph Hunter"
weeds_plasma_rate = 5
caste_name = "hunter"
slowdown = -2
total_health = 150
tail = "xenos_hunter_tail"
icobase = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi'
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/hunter,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/tackle,
/mob/living/carbon/human/proc/gut,
/mob/living/carbon/human/proc/leap,
/mob/living/carbon/human/proc/psychic_whisper,
/mob/living/carbon/human/proc/regurgitate
)
/datum/species/xenos/sentinel
name = "Xenomorph Sentinel"
weeds_plasma_rate = 10
caste_name = "sentinel"
slowdown = 0
total_health = 125
tail = "xenos_sentinel_tail"
icobase = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi'
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/sentinel,
O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/tackle,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/corrosive_acid,
/mob/living/carbon/human/proc/neurotoxin
)
/datum/species/xenos/queen
name = "Xenomorph Queen"
total_health = 250
weeds_heal_rate = 5
weeds_plasma_rate = 20
caste_name = "queen"
slowdown = 4
tail = "xenos_queen_tail"
rarity_value = 10
icobase = 'icons/mob/human_races/xenos/r_xenos_queen.dmi'
deform = 'icons/mob/human_races/xenos/r_xenos_queen.dmi'
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_EGG = /obj/item/organ/internal/xenos/eggsac,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/queen,
O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
/mob/living/proc/ventcrawl,
/mob/living/carbon/human/proc/psychic_whisper,
/mob/living/carbon/human/proc/regurgitate,
/mob/living/carbon/human/proc/lay_egg,
/mob/living/carbon/human/proc/plant,
/mob/living/carbon/human/proc/transfer_plasma,
/mob/living/carbon/human/proc/corrosive_acid,
/mob/living/carbon/human/proc/neurotoxin,
/mob/living/carbon/human/proc/resin
)
/datum/species/xenos/queen/handle_login_special(var/mob/living/carbon/human/H)
..()
// Make sure only one official queen exists at any point.
if(!alien_queen_exists(1,H))
H.real_name = "alien queen ([alien_number])"
H.name = H.real_name
else
H.real_name = "alien princess ([alien_number])"
H.name = H.real_name
/datum/hud_data/alien
icon = 'icons/mob/screen1_alien.dmi'
has_a_intent = 1
has_m_intent = 1
has_warnings = 1
has_hands = 1
has_drop = 1
has_throw = 1
has_resist = 1
has_pressure = 0
has_nutrition = 0
has_bodytemp = 0
has_internals = 0
gear = list(
"o_clothing" = list("loc" = ui_belt, "name" = "Suit", "slot" = slot_wear_suit, "state" = "equip", "dir" = SOUTH),
"head" = list("loc" = ui_id, "name" = "Hat", "slot" = slot_head, "state" = "hair"),
"storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"),
"storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"),
)
@@ -1,49 +0,0 @@
proc/create_new_xenomorph(var/alien_caste,var/target)
target = get_turf(target)
if(!target || !alien_caste) return
var/mob/living/carbon/human/new_alien = new(target)
new_alien.set_species("Xenomorph [alien_caste]")
return new_alien
/mob/living/carbon/human/xdrone/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Xenomorph Drone")
/mob/living/carbon/human/xsentinel/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Xenomorph Sentinel")
/mob/living/carbon/human/xhunter/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Xenomorph Hunter")
/mob/living/carbon/human/xqueen/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Xenomorph Queen")
// I feel like we should generalize/condense down all the various icon-rendering antag procs.
/*----------------------------------------
Proc: AddInfectionImages()
Des: Gives the client of the alien an image on each infected mob.
----------------------------------------*/
/mob/living/carbon/human/proc/AddInfectionImages()
if (client)
for (var/mob/living/C in mob_list)
if(C.status_flags & XENO_HOST)
var/obj/item/alien_embryo/A = locate() in C
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
client.images += I
return
/*----------------------------------------
Proc: RemoveInfectionImages()
Des: Removes all infected images from the alien.
----------------------------------------*/
/mob/living/carbon/human/proc/RemoveInfectionImages()
if (client)
for(var/image/I in client.images)
if(dd_hasprefix_case(I.icon_state, "infected"))
qdel(I)
return
@@ -22,7 +22,6 @@
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
//IAN! SQUEEEEEEEEE~
/mob/living/simple_animal/corgi/Ian
@@ -124,12 +123,6 @@
if(back_icon)
overlays += back_icon
if(facehugger)
if(istype(src, /mob/living/simple_animal/corgi/puppy))
overlays += image('icons/mob/mask.dmi',"facehugger_corgipuppy")
else
overlays += image('icons/mob/mask.dmi',"facehugger_corgi")
return
@@ -14,6 +14,18 @@
emote_see = list("jiggles", "bounces in place")
var/colour = "grey"
/mob/living/simple_animal/slime/science
name = "Kendrick"
colour = "rainbow"
icon_state = "rainbow baby slime"
icon_living = "rainbow baby slime"
icon_dead = "rainbow baby slime dead"
/mob/living/simple_animal/slime/science/initialize()
..()
overlays.Cut()
overlays += "aslime-:33"
/mob/living/simple_animal/adultslime
name = "pet slime"
desc = "A lovable, domesticated slime."
@@ -33,8 +45,7 @@
..()
overlays += "aslime-:33"
/mob/living/simple_animal/slime/adult/death()
/mob/living/simple_animal/adultslime/death()
var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
S1.icon_state = "[src.colour] baby slime"
S1.icon_living = "[src.colour] baby slime"
@@ -50,13 +50,6 @@
stance = HOSTILE_STANCE_ATTACK
T = M
break
if(istype(A, /obj/machinery/bot))
var/obj/machinery/bot/B = A
if (B.health > 0)
stance = HOSTILE_STANCE_ATTACK
T = B
break
return T
@@ -101,9 +94,6 @@
var/obj/mecha/M = target_mob
M.attack_generic(src,rand(melee_damage_lower,melee_damage_upper),attacktext)
return M
if(istype(target_mob,/obj/machinery/bot))
var/obj/machinery/bot/B = target_mob
B.attack_generic(src,rand(melee_damage_lower,melee_damage_upper),attacktext)
/mob/living/simple_animal/hostile/proc/LoseTarget()
stance = HOSTILE_STANCE_IDLE
@@ -359,10 +359,6 @@
var/obj/mecha/M = target_mob
if (M.occupant)
return (0)
if (istype(target_mob,/obj/machinery/bot))
var/obj/machinery/bot/B = target_mob
if(B.health > 0)
return (0)
return 1
/mob/living/simple_animal/say(var/message)
-11
View File
@@ -505,17 +505,6 @@
namecounts[name] = 1
creatures[name] = O
if(istype(O, /obj/machinery/bot))
var/name = "BOT: [O.name]"
if (names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
names.Add(name)
namecounts[name] = 1
creatures[name] = O
for(var/mob/M in sortAtom(mob_list))
var/name = M.name
if (names.Find(name))
-6
View File
@@ -1,10 +1,4 @@
// fun if you want to typecast humans/monkeys/etc without writing long path-filled lines.
/proc/isxenomorph(A)
if(istype(A, /mob/living/carbon/human))
var/mob/living/carbon/human/H = A
return istype(H.species, /datum/species/xenos)
return 0
/proc/issmall(A)
if(A && istype(A, /mob/living))
var/mob/living/L = A
@@ -103,10 +103,6 @@
name = "Shoulder-length Hair"
icon_state = "hair_b"
longalt
name = "Shoulder-length Hair Alt"
icon_state = "hair_longfringe"
/*longish
name = "Longer Hair"
icon_state = "hair_b2"*/
@@ -115,10 +111,6 @@
name = "Long Hair"
icon_state = "hair_vlong"
longeralt
name = "Long Hair Alt"
icon_state = "hair_vlongfringe"
longest
name = "Very Long Hair"
icon_state = "hair_longest"
@@ -482,7 +474,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
species_allowed = list("Human","Unathi","Tajara","Skrell","Vox","Machine","Teshari")
species_allowed = list("Human","Unathi","Tajara","Skrell", "Machine","Teshari")
teshari_beard
name = "Teshari Beard"
@@ -677,11 +669,6 @@
icon_state = "hair_messy"
species_allowed = list("Tajara")
vox_quills_short
name = "Short Vox Quills"
icon_state = "vox_shortquills"
species_allowed = list("Vox")
/datum/sprite_accessory/facial_hair
taj_sideburns
-24
View File
@@ -161,30 +161,6 @@
qdel(src)
return O
//human -> alien
/mob/living/carbon/human/proc/Alienize()
if (transforming)
return
for(var/obj/item/W in src)
drop_from_inventory(W)
regenerate_icons()
transforming = 1
canmove = 0
icon = null
invisibility = 101
for(var/t in organs)
qdel(t)
var/alien_caste = pick("Hunter","Sentinel","Drone")
var/mob/living/carbon/human/new_xeno = create_new_xenomorph(alien_caste,loc)
new_xeno.a_intent = I_HURT
new_xeno.key = key
new_xeno << "<B>You are now an alien.</B>"
qdel(src)
return
/mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num)
if (transforming)
return
-3
View File
@@ -56,6 +56,3 @@
if(owner && owner.stat != DEAD && !is_broken())
backup_time = world.time
if(owner.mind) backup = owner.mind
/obj/item/organ/internal/stack/vox/stack
name = "vox cortical stack"
-3
View File
@@ -1326,9 +1326,6 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/head/seromi
eye_icon = "eyes_seromi"
/obj/item/organ/external/head/vox
eye_icon = "vox_eyes_s"
/obj/item/organ/external/head/no_eyes
eye_icon = "blank_eyes"
-52
View File
@@ -1,52 +0,0 @@
//XENOMORPH ORGANS
/obj/item/organ/internal/xenos
name = "xeno organ"
icon = 'icons/effects/blood.dmi'
desc = "It smells like an accident in a chemical factory."
/obj/item/organ/internal/xenos/eggsac
name = "egg sac"
parent_organ = BP_GROIN
icon_state = "xgibmid1"
organ_tag = O_EGG
/obj/item/organ/internal/xenos/plasmavessel
name = "plasma vessel"
parent_organ = BP_TORSO
icon_state = "xgibdown1"
organ_tag = O_PLASMA
var/stored_plasma = 0
var/max_plasma = 500
/obj/item/organ/internal/xenos/plasmavessel/queen
name = "bloated plasma vessel"
stored_plasma = 200
max_plasma = 500
/obj/item/organ/internal/xenos/plasmavessel/sentinel
stored_plasma = 100
max_plasma = 250
/obj/item/organ/internal/xenos/plasmavessel/hunter
name = "tiny plasma vessel"
stored_plasma = 100
max_plasma = 150
/obj/item/organ/internal/xenos/acidgland
name = "acid gland"
parent_organ = BP_HEAD
icon_state = "xgibtorso"
organ_tag = O_ACID
/obj/item/organ/internal/xenos/hivenode
name = "hive node"
parent_organ = BP_TORSO
icon_state = "xgibmid2"
organ_tag = O_HIVE
/obj/item/organ/internal/xenos/resinspinner
name = "resin spinner"
parent_organ = BP_HEAD
icon_state = "xgibmid2"
organ_tag = O_RESIN
+1 -9
View File
@@ -1,4 +1,4 @@
//Vox pinning weapon.
// Alien pinning weapon.
/obj/item/weapon/gun/launcher/spikethrower
name = "spike thrower"
@@ -37,14 +37,6 @@
/obj/item/weapon/gun/launcher/spikethrower/update_icon()
icon_state = "spikethrower[spikes]"
/obj/item/weapon/gun/launcher/spikethrower/special_check(user)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(H.species && H.species.get_bodytype() != "Vox")
user << "<span class='warning'>\The [src] does not respond to you!</span>"
return 0
return ..()
/obj/item/weapon/gun/launcher/spikethrower/update_release_force()
return
@@ -26,7 +26,7 @@
item_state = "bolt"
/obj/item/weapon/arrow/quill
name = "vox quill"
name = "alien quill"
desc = "A wickedly barbed quill from some bizarre animal."
icon = 'icons/obj/weapons.dmi'
icon_state = "quill"
@@ -116,7 +116,7 @@
//double check that the user hasn't removed the bolt in the meantime
if(!(bolt && tension && loc == current_user))
return
tension++
update_icon()
@@ -6,7 +6,7 @@
embed = 1 //the dart is shot fast enough to pierce space suits, so I guess splintering inside the target can be a thing. Should be rare due to low damage.
var/reagent_amount = 15
kill_count = 15 //shorter range
muzzle_type = null
/obj/item/projectile/bullet/chemdart/New()
@@ -194,13 +194,3 @@
unload_ammo(usr)
src.updateUsrDialog()
return
/obj/item/weapon/gun/projectile/dartgun/vox
name = "alien dart gun"
desc = "A small gas-powered dartgun, fitted for nonhuman hands."
/obj/item/weapon/gun/projectile/dartgun/vox/medical
starting_chems = list("kelotane","bicaridine","anti_toxin")
/obj/item/weapon/gun/projectile/dartgun/vox/raider
starting_chems = list("space_drugs","stoxin","impedrezene")
@@ -32,8 +32,6 @@
var/options = list("robot", "slime")
for(var/t in all_species)
options += t
options -= "Xenomorph Queen"
options -= "Xenomorph"
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species)
@@ -178,11 +178,8 @@
W.visible_message("<span class='notice'>The fungi are completely dissolved by the solution!</span>")
/datum/reagent/toxin/plantbgone/touch_obj(var/obj/O, var/volume)
if(istype(O, /obj/effect/alien/weeds/))
var/obj/effect/alien/weeds/alien_weeds = O
alien_weeds.health -= rand(15, 35)
alien_weeds.healthcheck()
else if(istype(O, /obj/effect/plant))
..()
if(istype(O, /obj/effect/plant))
qdel(O)
/datum/reagent/toxin/plantbgone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
@@ -42,7 +42,8 @@
var/trans = reagents.trans_to_obj(target, amount_per_transfer_from_this)
user << "<span class='notice'>You add [trans] units of the condiment to \the [target].</span>"
else(..())
else
..()
feed_sound(var/mob/user)
playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1)
+1 -1
View File
@@ -1,4 +1,4 @@
/obj/machinery/computer/shuttle_control/multi/vox
/obj/machinery/computer/shuttle_control/multi/skipjack
name = "skipjack control console"
req_access = list(access_syndicate)
shuttle_tag = "Skipjack"
-40
View File
@@ -12,46 +12,6 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == (affected.encased ? 3 : 2)
//////////////////////////////////////////////////////////////////
// ALIEN EMBRYO SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/internal/remove_embryo
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
/obj/item/weapon/material/kitchen/utensil/fork = 20
)
blood_level = 2
min_duration = 80
max_duration = 100
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/embryo = 0
for(var/obj/item/alien_embryo/A in target)
embryo = 1
break
if (!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && embryo && affected.open == 3 && target_zone == BP_TORSO
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]."
var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your chest!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("<span class='warning'>[user] rips the larva out of [target]'s ribcage!</span>",
"You rip the larva out of [target]'s ribcage!")
for(var/obj/item/alien_embryo/A in target)
A.loc = A.loc.loc
//////////////////////////////////////////////////////////////////
// CHEST INTERNAL ORGAN SURGERY //
//////////////////////////////////////////////////////////////////