Merge branch 'master' into tweakfixes

This commit is contained in:
cadyn
2020-10-28 21:33:40 -07:00
committed by GitHub
28 changed files with 272 additions and 152 deletions

View File

@@ -1,21 +0,0 @@
/obj/item/device/paicard/attack_ghost(mob/user as mob)
if(src.pai != null) //Have a person in them already?
user.examinate(src)
return
var/choice = input(user, "You sure you want to inhabit this PAI?") in list("Yes", "No")
var/pai_name = input(user, "Choose your character's name", "Character Name") as text
var/actual_pai_name = sanitize_name(pai_name)
var/pai_key
if (isnull(pai_name))
return
if(choice == "Yes")
pai_key = user.key
else
return
var/turf/location = get_turf(src)
var/obj/item/device/paicard/card = new(location)
var/mob/living/silicon/pai/pai = new(card)
qdel(src)
pai.key = pai_key
card.setPersonality(pai)
pai.SetName(actual_pai_name)

View File

@@ -27,3 +27,19 @@
/datum/looping_sound/geiger/stop() /datum/looping_sound/geiger/stop()
. = ..() . = ..()
last_radiation = 0 last_radiation = 0
/datum/looping_sound/small_motor
start_sound = 'sound/items/small_motor/motor_start_nopull.ogg'
start_length = 2 SECONDS
mid_sounds = list(
'sound/items/small_motor/motor_idle.ogg',
'sound/items/small_motor/motor_fast.ogg',
'sound/items/small_motor/motor_faster.ogg'
)
mid_length = 1.9 SECONDS //someone make this loop better please, i'm no good at sound. the clips should be 2 seconds exact but there's a gap if it's set to 2
end_sound = 'sound/items/small_motor/motor_end.ogg'
var/speed = 1
/datum/looping_sound/small_motor/get_sound(starttime)
speed = clamp(speed, 1, 3)
return ..(starttime, mid_sounds[speed])

View File

@@ -358,6 +358,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Thunderdome (Observer.)" name = "\improper Thunderdome (Observer.)"
icon_state = "purple" icon_state = "purple"
/area/virtual_reality
name = "Virtual Reality"
icon_state = "Virtual_Reality"
dynamic_lighting = 0
requires_power = 0
flags = AREA_FLAG_IS_NOT_PERSISTENT
//ENEMY //ENEMY
//names are used //names are used

View File

@@ -828,3 +828,53 @@
/obj/item/stack/cable_coil/random = 4) /obj/item/stack/cable_coil/random = 4)
premium = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1) premium = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
contraband = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1) contraband = list(/obj/item/weapon/storage/box/wormcan/deluxe = 1)
/obj/machinery/vending/virtual_autodrobe
name = "Virtual AutoDrobe"
desc = "A virtual vending machine for virtual avatar customization."
icon_state = "Theater"
product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!"
products = list(/obj/item/weapon/storage/box/syndie_kit/chameleon = 20)
/obj/machinery/vending/deathmatch
name = "Annihilation Shop (Green)"
desc = "A virtual vending machine for virtual murder equipment. This one's for green team."
products = list(/obj/item/weapon/melee/energy/sword = 5,
/obj/item/weapon/melee/energy/axe = 5,
/obj/item/weapon/melee/baton/loaded = 5,
/obj/item/weapon/gun/energy/laser = 5,
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 5,
/obj/item/ammo_magazine/clip/c12g/pellet = 40,
/obj/item/ammo_magazine/clip/c12g = 50,
/obj/item/weapon/storage/box/flashbangs = 2,
/obj/item/clothing/head/helmet/swat = 5,
/obj/item/clothing/suit/armor/vest = 5,
/obj/item/clothing/head/helmet/thunderdome = 5,
/obj/item/clothing/shoes/brown = 5,
/obj/item/clothing/suit/armor/tdome/green = 5,
/obj/item/clothing/under/color/green = 5,
/obj/item/weapon/reagent_containers/pill/adminordrazine = 10,
/obj/item/weapon/tool/crowbar = 1)
/obj/machinery/vending/deathmatch/red
name = "Annihilation Shop (Red)"
desc = "A virtual vending machine for virtual murder equipment. This one's for red team."
products = list(/obj/item/weapon/melee/energy/sword = 5,
/obj/item/weapon/melee/energy/axe = 5,
/obj/item/weapon/melee/baton/loaded = 5,
/obj/item/weapon/gun/energy/laser = 5,
/obj/item/weapon/gun/projectile/shotgun/pump/combat = 5,
/obj/item/ammo_magazine/clip/c12g/pellet = 40,
/obj/item/ammo_magazine/clip/c12g = 50,
/obj/item/weapon/storage/box/flashbangs = 2,
/obj/item/clothing/head/helmet/swat = 5,
/obj/item/clothing/suit/armor/vest = 5,
/obj/item/clothing/head/helmet/thunderdome = 5,
/obj/item/clothing/shoes/brown = 5,
/obj/item/clothing/suit/armor/tdome/red = 5,
/obj/item/clothing/under/color/red = 5,
/obj/item/weapon/reagent_containers/pill/adminordrazine = 10,
/obj/item/weapon/tool/crowbar = 1)

View File

@@ -33,23 +33,29 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
QDEL_NULL(radio) QDEL_NULL(radio)
return ..() return ..()
/obj/item/device/paicard/attack_ghost(mob/observer/dead/user) // VOREStation Edit - Allow everyone to become a pAI
if(istype(user) && user.can_admin_interact()) /obj/item/device/paicard/attack_ghost(mob/user as mob)
switch(alert(user, "Would you like to become a pAI by force? (Admin)", "pAI Creation", "Yes", "No")) if(pai != null) //Have a person in them already?
if("Yes") return ..()
// Copied from paiController/Topic
var/mob/living/silicon/pai/pai = new(src)
pai.name = user.name
pai.real_name = pai.name
pai.key = user.key
setPersonality(pai) var/choice = input(user, "You sure you want to inhabit this PAI?") in list("Yes", "No")
looking_for_personality = FALSE if(choice == "No")
return ..()
if(pai.mind) var/pai_name = input(user, "Choose your character's name", "Character Name") as text
update_antag_icons(pai.mind) var/actual_pai_name = sanitize_name(pai_name)
if(isnull(actual_pai_name))
return ..()
var/turf/location = get_turf(src)
var/obj/item/device/paicard/card = new(location)
var/mob/living/silicon/pai/new_pai = new(card)
qdel(src)
new_pai.key = user.key
card.setPersonality(new_pai)
new_pai.SetName(actual_pai_name)
return ..() return ..()
// VOREStation Edit End
/obj/item/device/paicard/attack_self(mob/user) /obj/item/device/paicard/attack_self(mob/user)
if (!in_range(src, user)) if (!in_range(src, user))

View File

@@ -34,11 +34,6 @@
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return return
//VOREStation Add - No talking during voting
if(SSvote && SSvote.mode)
to_chat(src, "<span class='danger'>OOC is not allowed during voting.</span>")
return
//VOREStation Add End
if(findtext(msg, "discord.gg") && !config.allow_discord_links) if(findtext(msg, "discord.gg") && !config.allow_discord_links)
to_chat(src, "<B>Advertising discords is not allowed.</B>") to_chat(src, "<B>Advertising discords is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]") log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")

View File

@@ -91,7 +91,7 @@
EQUIPMENT("Fine Excavation Kit - Measuring Tape", /obj/item/device/measuring_tape, 125), EQUIPMENT("Fine Excavation Kit - Measuring Tape", /obj/item/device/measuring_tape, 125),
EQUIPMENT("Fine Excavation Kit - Hand Pick", /obj/item/weapon/pickaxe/hand, 375), EQUIPMENT("Fine Excavation Kit - Hand Pick", /obj/item/weapon/pickaxe/hand, 375),
EQUIPMENT("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic/locked, 1500), EQUIPMENT("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic/locked, 1500),
EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 3000), EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed/phoronbore/loaded, 3000),
EQUIPMENT("Industrial Equipment - Inducer", /obj/item/weapon/inducer, 900), EQUIPMENT("Industrial Equipment - Inducer", /obj/item/weapon/inducer, 900),
EQUIPMENT("Industrial Equipment - Sheet-Snatcher", /obj/item/weapon/storage/bag/sheetsnatcher, 500), EQUIPMENT("Industrial Equipment - Sheet-Snatcher", /obj/item/weapon/storage/bag/sheetsnatcher, 500),
) )

View File

@@ -54,7 +54,7 @@
EQUIPMENT("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 15), EQUIPMENT("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 15),
EQUIPMENT("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 50), EQUIPMENT("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 50),
EQUIPMENT("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 100), EQUIPMENT("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 100),
EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 300), EQUIPMENT("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed/phoronbore/loaded, 300),
EQUIPMENT("Industrial Equipment - Inducer", /obj/item/weapon/inducer, 90), EQUIPMENT("Industrial Equipment - Inducer", /obj/item/weapon/inducer, 90),
EQUIPMENT("Laser Pointer", /obj/item/device/laser_pointer, 90), EQUIPMENT("Laser Pointer", /obj/item/device/laser_pointer, 90),
EQUIPMENT("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 310), EQUIPMENT("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 310),

View File

@@ -284,7 +284,7 @@
var/list/vorestrings = list() var/list/vorestrings = list()
vorestrings += examine_weight() vorestrings += examine_weight()
vorestrings += examine_nutrition() vorestrings += examine_nutrition()
vorestrings += examine_reagent_bellies() //CHOMP reagent bellies // vorestrings += examine_reagent_bellies() //CHOMP reagent bellies
vorestrings += examine_bellies() vorestrings += examine_bellies()
vorestrings += examine_pickup_size() vorestrings += examine_pickup_size()
vorestrings += examine_step_size() vorestrings += examine_step_size()

View File

@@ -257,12 +257,12 @@
// Play every 20 steps while walking, for the sneak // Play every 20 steps while walking, for the sneak
if(m_intent == "walk" && step_count++ % 20 != 0) if(m_intent == "walk" && step_count++ % 20 != 0)
check_vorefootstep(m_intent, T) //CHOMPstation edit: sloshing reagent belly walk system // check_vorefootstep(m_intent, T) //CHOMPstation edit: sloshing reagent belly walk system
return return
// Play every other step while running // Play every other step while running
if(m_intent == "run" && step_count++ % 2 != 0) if(m_intent == "run" && step_count++ % 2 != 0)
check_vorefootstep(m_intent, T) //CHOMPstation edit: sloshing reagent belly walk system // check_vorefootstep(m_intent, T) //CHOMPstation edit: sloshing reagent belly walk system
return return
var/volume = config.footstep_volume var/volume = config.footstep_volume

View File

@@ -591,8 +591,8 @@ datum/species/harpy
min_age = 18 min_age = 18
max_age = 80 max_age = 80
male_scream_sound = null //CHOMPedit male_scream_sound = list('sound/effects/mob_effects/x_scream1.ogg','sound/effects/mob_effects/x_scream2.ogg','sound/effects/mob_effects/x_scream3.ogg') //CHOMPedit Scree
female_scream_sound = null //CHOMPedit female_scream_sound = list('sound/effects/mob_effects/x_scream1.ogg','sound/effects/mob_effects/x_scream2.ogg','sound/effects/mob_effects/x_scream3.ogg') //CHOMPedit
blurb = "Xenomorphs hybrids are a mixture of xenomorph DNA and some other humanoid species. \ blurb = "Xenomorphs hybrids are a mixture of xenomorph DNA and some other humanoid species. \
Xenomorph hyrids mostly have had had their natural aggression removed due to the gene modification process \ Xenomorph hyrids mostly have had had their natural aggression removed due to the gene modification process \

View File

@@ -10,8 +10,8 @@
hud_type = /datum/hud_data/alien hud_type = /datum/hud_data/alien
rarity_value = 3 rarity_value = 3
male_scream_sound = null //CHOMPedit Note, add xenomorph screams later, shouldn't be hard male_scream_sound = list('sound/effects/mob_effects/x_scream1.ogg','sound/effects/mob_effects/x_scream2.ogg','sound/effects/mob_effects/x_scream3.ogg') //CHOMPedit SCREE
female_scream_sound = null //CHOMPedit female_scream_sound = list('sound/effects/mob_effects/x_scream1.ogg','sound/effects/mob_effects/x_scream2.ogg','sound/effects/mob_effects/x_scream3.ogg') //CHOMPedit SCREE
darksight = 10 //CHOMPedit. Added darksight darksight = 10 //CHOMPedit. Added darksight
vision_flags = SEE_SELF|SEE_MOBS|SEE_TURFS //CHOMPedit trying to make xenos see properly vision_flags = SEE_SELF|SEE_MOBS|SEE_TURFS //CHOMPedit trying to make xenos see properly

View File

@@ -1,27 +1,24 @@
/obj/item/weapon/gun/magnetic/matfed /obj/item/weapon/gun/magnetic/matfed
name = "portable phoron bore"
desc = "A large man-portable tunnel bore, using phorogenic plasma blasts. Point away from user."
description_fluff = "An aging Grayson Manufactories mining tool used for rapidly digging through rock. Mass production was discontinued when many of the devices were stolen and used to break into a high security facility by Boiling Point drones."
description_antag = "This device is exceptional at breaking down walls, though it is incredibly loud when doing so."
description_info = "The projectile of this tool will travel six tiles before dissipating, excavating mineral walls as it does so. It can be reloaded with phoron sheets."
icon_state = "bore"
item_state = "bore"
wielded_item_state = "bore-wielded"
one_handed_penalty = 5
projectile_type = /obj/item/projectile/bullet/magnetic/bore
gun_unreliable = 0
power_cost = 750 power_cost = 750
load_type = /obj/item/stack/material load_type = list(/obj/item/stack/material, /obj/item/weapon/ore)
var/mat_storage = 0 // How much material is stored inside? Input in multiples of 2000 as per auto/protolathe. var/mat_storage = 0 // How much material is stored inside? Input in multiples of 2000 as per auto/protolathe.
var/max_mat_storage = 8000 // How much material can be stored inside? var/max_mat_storage = 8000 // How much material can be stored inside?
var/mat_cost = 500 // How much material is used per-shot? var/mat_cost = 500 // How much material is used per-shot?
var/ammo_material = MAT_PHORON var/ammo_material
var/obj/item/weapon/stock_parts/manipulator/manipulator // Installed manipulator. Mostly for Phoron Bore, higher rating == less mats consumed upon firing. Set to a path to spawn with one of that type.
var/loading = FALSE var/loading = FALSE
/obj/item/weapon/gun/magnetic/matfed/Initialize()
. = ..()
if(ispath(manipulator))
manipulator = new manipulator(src)
if(manipulator)
mat_cost = initial(mat_cost) / (2*manipulator.rating)
/obj/item/weapon/gun/magnetic/matfed/Destroy()
QDEL_NULL(manipulator)
. = ..()
/obj/item/weapon/gun/magnetic/matfed/examine(mob/user) /obj/item/weapon/gun/magnetic/matfed/examine(mob/user)
. = ..() . = ..()
var/ammotext = show_ammo() var/ammotext = show_ammo()
@@ -46,6 +43,7 @@
overlays = overlays_to_add overlays = overlays_to_add
..() ..()
/obj/item/weapon/gun/magnetic/matfed/attack_hand(var/mob/user) // It doesn't keep a loaded item inside. /obj/item/weapon/gun/magnetic/matfed/attack_hand(var/mob/user) // It doesn't keep a loaded item inside.
if(user.get_inactive_hand() == src) if(user.get_inactive_hand() == src)
var/obj/item/removing var/obj/item/removing
@@ -55,7 +53,6 @@
cell = null cell = null
if(removing) if(removing)
removing.forceMove(get_turf(src))
user.put_in_hands(removing) user.put_in_hands(removing)
user.visible_message("<span class='notice'>\The [user] removes \the [removing] from \the [src].</span>") user.visible_message("<span class='notice'>\The [user] removes \the [removing] from \the [src].</span>")
playsound(src, 'sound/machines/click.ogg', 10, 1) playsound(src, 'sound/machines/click.ogg', 10, 1)
@@ -77,91 +74,170 @@
/obj/item/weapon/gun/magnetic/matfed/attackby(var/obj/item/thing, var/mob/user) /obj/item/weapon/gun/magnetic/matfed/attackby(var/obj/item/thing, var/mob/user)
if(removable_components) if(removable_components)
if(istype(thing, /obj/item/weapon/cell))
if(cell)
to_chat(user, "<span class='warning'>\The [src] already has \a [cell] installed.</span>")
return
cell = thing
user.drop_from_inventory(cell)
cell.forceMove(src)
playsound(src, 'sound/machines/click.ogg', 10, 1)
user.visible_message("<span class='notice'>\The [user] slots \the [cell] into \the [src].</span>")
update_icon()
return
if(thing.is_crowbar()) if(thing.is_crowbar())
if(!manipulator) if(!manipulator)
to_chat(user, "<span class='warning'>\The [src] has no manipulator installed.</span>") to_chat(user, "<span class='warning'>\The [src] has no manipulator installed.</span>")
return return
manipulator.forceMove(get_turf(src))
user.put_in_hands(manipulator) user.put_in_hands(manipulator)
user.visible_message("<span class='notice'>\The [user] levers \the [manipulator] from \the [src].</span>") user.visible_message("<span class='notice'>\The [user] levers \the [manipulator] from \the [src].</span>")
playsound(src, 'sound/items/Crowbar.ogg', 50, 1) playsound(src, thing.usesound, 50, 1)
mat_cost = initial(mat_cost)
manipulator = null manipulator = null
update_icon() update_icon()
return return
if(thing.is_screwdriver())
if(!capacitor)
to_chat(user, "<span class='warning'>\The [src] has no capacitor installed.</span>")
return
capacitor.forceMove(get_turf(src))
user.put_in_hands(capacitor)
user.visible_message("<span class='notice'>\The [user] unscrews \the [capacitor] from \the [src].</span>")
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
capacitor = null
update_icon()
return
if(istype(thing, /obj/item/weapon/stock_parts/capacitor))
if(capacitor)
to_chat(user, "<span class='warning'>\The [src] already has \a [capacitor] installed.</span>")
return
capacitor = thing
user.drop_from_inventory(capacitor)
capacitor.forceMove(src)
playsound(src, 'sound/machines/click.ogg', 10, 1)
power_per_tick = (power_cost*0.15) * capacitor.rating
user.visible_message("<span class='notice'>\The [user] slots \the [capacitor] into \the [src].</span>")
update_icon()
return
if(istype(thing, /obj/item/weapon/stock_parts/manipulator)) if(istype(thing, /obj/item/weapon/stock_parts/manipulator))
if(manipulator) if(manipulator)
to_chat(user, "<span class='warning'>\The [src] already has \a [manipulator] installed.</span>") to_chat(user, "<span class='warning'>\The [src] already has \a [manipulator] installed.</span>")
return return
manipulator = thing manipulator = thing
user.drop_from_inventory(manipulator) user.drop_from_inventory(manipulator, src)
manipulator.forceMove(src)
playsound(src, 'sound/machines/click.ogg', 10,1) playsound(src, 'sound/machines/click.ogg', 10,1)
mat_cost = initial(mat_cost) % (2*manipulator.rating) mat_cost = initial(mat_cost) / (2*manipulator.rating)
user.visible_message("<span class='notice'>\The [user] slots \the [manipulator] into \the [src].</span>") user.visible_message("<span class='notice'>\The [user] slots \the [manipulator] into \the [src].</span>")
update_icon() update_icon()
return return
if(istype(thing, load_type)) if(is_type_in_list(thing, load_type))
loading = TRUE
var/obj/item/stack/material/M = thing var/obj/item/stack/material/M = thing
if(!M.material || M.material.name != ammo_material) if(istype(M)) //stack
return if(!M.material || M.material.name != ammo_material || loading)
return
if(mat_storage + 2000 > max_mat_storage) if(mat_storage + SHEET_MATERIAL_AMOUNT > max_mat_storage)
to_chat(user, "<span class='warning'>\The [src] cannot hold more [ammo_material].</span>") to_chat(user, "<span class='warning'>\The [src] cannot hold more [ammo_material].</span>")
return return
var/can_hold_val = 0 var/can_hold_val = 0
while(can_hold_val < M.amount) //CHOMPEdit loading = TRUE
if(mat_storage + 2000 <= max_mat_storage && do_after(user,1.5 SECONDS)) while(can_hold_val < M.amount && mat_storage + SHEET_MATERIAL_AMOUNT <= max_mat_storage && do_after(user,1.5 SECONDS)) //CHOMPEdit
can_hold_val ++ can_hold_val ++
mat_storage += 2000 mat_storage += SHEET_MATERIAL_AMOUNT
playsound(src, 'sound/effects/phasein.ogg', 15, 1) playsound(src, 'sound/effects/phasein.ogg', 15, 1)
else M.use(can_hold_val)
loading = FALSE loading = FALSE
break
M.use(can_hold_val) else //ore
if(M.material != ammo_material)
return
if(mat_storage + (SHEET_MATERIAL_AMOUNT/2*0.8) > max_mat_storage)
to_chat(user, "<span class='warning'>\The [src] cannot hold more [ammo_material].</span>")
return
qdel(M)
mat_storage += (SHEET_MATERIAL_AMOUNT/2*0.8) //two plasma ores needed per sheet, some inefficiency for not using refined product
user.visible_message("<span class='notice'>\The [user] loads \the [src] with \the [M].</span>") user.visible_message("<span class='notice'>\The [user] loads \the [src] with \the [M].</span>")
playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) playsound(src, 'sound/weapons/flipblade.ogg', 50, 1)
update_icon() update_icon()
return return
. = ..() . = ..()
#define GEN_STARTING -1
#define GEN_OFF 0
#define GEN_IDLE 1
#define GEN_ACTIVE 2
/obj/item/weapon/gun/magnetic/matfed/phoronbore
name = "portable phoron bore"
desc = "A large man-portable tunnel bore, using phorogenic plasma blasts. Point away from user."
description_fluff = "An aging Grayson Manufactories mining tool used for rapidly digging through rock. Mass production was discontinued when many of the devices were stolen and used to break into a high security facility by Boiling Point drones."
description_antag = "This device is exceptional at breaking down walls, though it is incredibly loud when doing so."
description_info = "The projectile of this tool will travel six tiles before dissipating, excavating mineral walls as it does so. It can be reloaded with phoron sheets or ore, and has a togglable generator that can recharge the power cell using stored phoron."
icon_state = "bore"
item_state = "bore"
wielded_item_state = "bore-wielded"
one_handed_penalty = 5
projectile_type = /obj/item/projectile/bullet/magnetic/bore
gun_unreliable = 0
power_cost = 100
ammo_material = MAT_PHORON
action_button_name = "Toggle internal generator"
var/generator_state = GEN_OFF
var/datum/looping_sound/small_motor/soundloop
var/time_started //to keep the soundloop from being "stopped" too soon and playing indefinitely
/obj/item/weapon/gun/magnetic/matfed/phoronbore/Initialize()
. = ..()
soundloop = new(list(src), 0)
/obj/item/weapon/gun/magnetic/matfed/phoronbore/Destroy()
QDEL_NULL(soundloop)
. = ..()
/obj/item/weapon/gun/magnetic/matfed/phoronbore/ui_action_click()
toggle_generator(usr)
/obj/item/weapon/gun/magnetic/matfed/phoronbore/process()
if(generator_state && !mat_storage)
audible_message(SPAN_NOTICE("\The [src] goes quiet."),SPAN_NOTICE("A motor noise cuts out."))
soundloop.stop()
generator_state = GEN_OFF
else if(generator_state > GEN_OFF)
if(generator_state == GEN_IDLE && (cell?.percent() < 80 || (!cell && capacitor && capacitor.charge/capacitor.max_charge < 0.8)))
generator_state = GEN_ACTIVE
else if(generator_state == GEN_ACTIVE && (!cell || cell.fully_charged()) && (!capacitor || capacitor.charge == capacitor.max_charge))
generator_state = GEN_IDLE
soundloop.speed = generator_state
generator_generate()
if(capacitor)
if(cell)
if(capacitor.charge < capacitor.max_charge && cell.checked_use(power_per_tick))
capacitor.charge(power_per_tick)
else if(!generator_state)
capacitor.use(capacitor.charge * 0.05)
update_state()
/obj/item/weapon/gun/magnetic/matfed/phoronbore/proc/generator_generate()
var/fuel_used = generator_state == GEN_IDLE ? 5 : 25
var/power_made = fuel_used * 800 * CELLRATE //20kW when active, same power as a pacman on setting one, but less efficient because compact and portable
if(cell)
cell.give(power_made)
else if(capacitor)
capacitor.charge(power_made)
mat_storage = max(mat_storage - fuel_used, 0)
var/turf/T = get_turf(src)
if(T)
T.assume_gas("carbon_dioxide", fuel_used * 0.01, T0C+200)
/obj/item/weapon/gun/magnetic/matfed/phoronbore/proc/toggle_generator(mob/living/user)
if(!generator_state && !mat_storage)
to_chat(user, SPAN_NOTICE("\The [src] has no fuel!"))
return
else if(!generator_state)
generator_state = GEN_STARTING
var/pull = (!cell || cell.charge < 100) ? rand(1,4) : 0
while(pull)
playsound(src, 'sound/items/small_motor/motor_pull_attempt.ogg', 100)
if(!do_after(user, 2 SECONDS, src))
generator_state = GEN_OFF
return
pull--
soundloop.start()
time_started = world.time
cell?.use(100)
audible_message(SPAN_NOTICE("\The [src] starts chugging."),SPAN_NOTICE("A motor noise starts up."))
generator_state = GEN_IDLE
else if(generator_state > GEN_OFF && time_started + 3 SECONDS < world.time)
soundloop.stop()
audible_message(SPAN_NOTICE("\The [src] goes quiet."),SPAN_NOTICE("A motor noise cuts out."))
generator_state = GEN_OFF
/obj/item/weapon/gun/magnetic/matfed/phoronbore/loaded
cell = /obj/item/weapon/cell/apc
capacitor = /obj/item/weapon/stock_parts/capacitor

View File

@@ -17,7 +17,6 @@
var/obj/item/weapon/cell/cell // Currently installed powercell. var/obj/item/weapon/cell/cell // Currently installed powercell.
var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. Set to a path to spawn with one of that type. var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. Set to a path to spawn with one of that type.
var/obj/item/weapon/stock_parts/manipulator/manipulator // Installed manipulator. Mostly for Phoron Bore, higher rating == less mats consumed upon firing. Set to a path to spawn with one of that type.
var/removable_components = TRUE // Whether or not the gun can be dismantled. var/removable_components = TRUE // Whether or not the gun can be dismantled.
var/gun_unreliable = 15 // Percentage chance of detonating in your hands. var/gun_unreliable = 15 // Percentage chance of detonating in your hands.
@@ -38,16 +37,14 @@
if(ispath(capacitor)) if(ispath(capacitor))
capacitor = new capacitor(src) capacitor = new capacitor(src)
capacitor.charge = capacitor.max_charge capacitor.charge = capacitor.max_charge
if(ispath(manipulator))
manipulator = new manipulator(src)
if(ispath(loaded)) if(ispath(loaded))
loaded = new loaded(src) loaded = new loaded(src)
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
if(capacitor) if(capacitor)
power_per_tick = (power_cost*0.15) * capacitor.rating power_per_tick = (power_cost*0.15) * capacitor.rating
update_icon() update_icon()
/obj/item/weapon/gun/magnetic/Destroy() /obj/item/weapon/gun/magnetic/Destroy()
@@ -55,7 +52,6 @@
QDEL_NULL(cell) QDEL_NULL(cell)
QDEL_NULL(loaded) QDEL_NULL(loaded)
QDEL_NULL(capacitor) QDEL_NULL(capacitor)
QDEL_NULL(manipulator)
. = ..() . = ..()
/obj/item/weapon/gun/magnetic/get_cell() /obj/item/weapon/gun/magnetic/get_cell()
@@ -68,7 +64,7 @@
capacitor.charge(power_per_tick) capacitor.charge(power_per_tick)
else else
capacitor.use(capacitor.charge * 0.05) capacitor.use(capacitor.charge * 0.05)
update_state() // May update icon, only if things changed. update_state() // May update icon, only if things changed.
/obj/item/weapon/gun/magnetic/proc/update_state() /obj/item/weapon/gun/magnetic/proc/update_state()
@@ -80,7 +76,7 @@
newstate |= ICON_CELL newstate |= ICON_CELL
if(capacitor) if(capacitor)
newstate |= ICON_CAP newstate |= ICON_CAP
// Functional state // Functional state
if(!cell || !capacitor) if(!cell || !capacitor)
newstate |= ICON_BAD newstate |= ICON_BAD
@@ -88,7 +84,7 @@
newstate |= ICON_CHARGE newstate |= ICON_CHARGE
else else
newstate |= ICON_READY newstate |= ICON_READY
// Ammo indicator // Ammo indicator
if(loaded) if(loaded)
newstate |= ICON_LOADED newstate |= ICON_LOADED
@@ -99,7 +95,7 @@
needs_update = TRUE needs_update = TRUE
state = newstate state = newstate
if(needs_update) if(needs_update)
update_icon() update_icon()
@@ -153,8 +149,7 @@
to_chat(user, "<span class='warning'>\The [src] already has \a [cell] installed.</span>") to_chat(user, "<span class='warning'>\The [src] already has \a [cell] installed.</span>")
return return
cell = thing cell = thing
user.drop_from_inventory(cell) user.drop_from_inventory(cell, src)
cell.forceMove(src)
playsound(src, 'sound/machines/click.ogg', 10, 1) playsound(src, 'sound/machines/click.ogg', 10, 1)
user.visible_message("<span class='notice'>\The [user] slots \the [cell] into \the [src].</span>") user.visible_message("<span class='notice'>\The [user] slots \the [cell] into \the [src].</span>")
update_icon() update_icon()
@@ -164,10 +159,9 @@
if(!capacitor) if(!capacitor)
to_chat(user, "<span class='warning'>\The [src] has no capacitor installed.</span>") to_chat(user, "<span class='warning'>\The [src] has no capacitor installed.</span>")
return return
capacitor.forceMove(get_turf(src))
user.put_in_hands(capacitor) user.put_in_hands(capacitor)
user.visible_message("<span class='notice'>\The [user] unscrews \the [capacitor] from \the [src].</span>") user.visible_message("<span class='notice'>\The [user] unscrews \the [capacitor] from \the [src].</span>")
playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src, thing.usesound, 50, 1)
capacitor = null capacitor = null
update_icon() update_icon()
return return
@@ -177,8 +171,7 @@
to_chat(user, "<span class='warning'>\The [src] already has \a [capacitor] installed.</span>") to_chat(user, "<span class='warning'>\The [src] already has \a [capacitor] installed.</span>")
return return
capacitor = thing capacitor = thing
user.drop_from_inventory(capacitor) user.drop_from_inventory(capacitor, src)
capacitor.forceMove(src)
playsound(src, 'sound/machines/click.ogg', 10, 1) playsound(src, 'sound/machines/click.ogg', 10, 1)
power_per_tick = (power_cost*0.15) * capacitor.rating power_per_tick = (power_cost*0.15) * capacitor.rating
user.visible_message("<span class='notice'>\The [user] slots \the [capacitor] into \the [src].</span>") user.visible_message("<span class='notice'>\The [user] slots \the [capacitor] into \the [src].</span>")

View File

@@ -162,6 +162,9 @@
irradiate = 20 irradiate = 20
range = 6 range = 6
/obj/item/projectile/bullet/magnetic/bore/get_structure_damage()
return damage * 3 //made for boring holes
/obj/item/projectile/bullet/magnetic/bore/Bump(atom/A, forced=0) /obj/item/projectile/bullet/magnetic/bore/Bump(atom/A, forced=0)
if(istype(A, /turf/simulated/mineral)) if(istype(A, /turf/simulated/mineral))
var/turf/simulated/mineral/MI = A var/turf/simulated/mineral/MI = A
@@ -171,7 +174,6 @@
return 0 return 0
else if(istype(A, /turf/simulated/wall) || istype(A, /turf/simulated/shuttle/wall)) // Cause a loud, but relatively minor explosion on the wall it hits. else if(istype(A, /turf/simulated/wall) || istype(A, /turf/simulated/shuttle/wall)) // Cause a loud, but relatively minor explosion on the wall it hits.
explosion(A, -1, -1, 1, 3) explosion(A, -1, -1, 1, 3)
qdel(src) return ..()
return 1
else else
..() ..()

View File

@@ -46,7 +46,7 @@
return TRUE return TRUE
M.vorePanel = new(M) M.vorePanel = new(M)
M.verbs += /mob/living/proc/insidePanel M.verbs += /mob/living/proc/insidePanel
M.verbs += /mob/living/proc/vore_transfer_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything // M.verbs += /mob/living/proc/vore_transfer_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything
//Tries to load prefs if a client is present otherwise gives freebie stomach //Tries to load prefs if a client is present otherwise gives freebie stomach
spawn(2 SECONDS) spawn(2 SECONDS)
@@ -243,8 +243,8 @@
//CHOMP reagent belly //CHOMP reagent belly
P.receive_reagents = src.receive_reagents // P.receive_reagents = src.receive_reagents
P.give_reagents = src.give_reagents // P.give_reagents = src.give_reagents
var/list/serialized = list() var/list/serialized = list()
@@ -280,8 +280,8 @@
can_be_drop_pred = P.can_be_drop_pred can_be_drop_pred = P.can_be_drop_pred
//CHOMP reagents belly //CHOMP reagents belly
receive_reagents = P.receive_reagents // receive_reagents = P.receive_reagents
give_reagents = P.give_reagents // give_reagents = P.give_reagents
if(bellies) if(bellies)
release_vore_contents(silent = TRUE) release_vore_contents(silent = TRUE)
@@ -862,8 +862,8 @@
dispvoreprefs += "<b>Healbelly permission:</b> [permit_healbelly ? "Allowed" : "Disallowed"]<br>" dispvoreprefs += "<b>Healbelly permission:</b> [permit_healbelly ? "Allowed" : "Disallowed"]<br>"
dispvoreprefs += "<b>Spontaneous vore prey:</b> [can_be_drop_prey ? "Enabled" : "Disabled"]<br>" dispvoreprefs += "<b>Spontaneous vore prey:</b> [can_be_drop_prey ? "Enabled" : "Disabled"]<br>"
dispvoreprefs += "<b>Spontaneous vore pred:</b> [can_be_drop_pred ? "Enabled" : "Disabled"]<br>" dispvoreprefs += "<b>Spontaneous vore pred:</b> [can_be_drop_pred ? "Enabled" : "Disabled"]<br>"
dispvoreprefs += "<b>Receiving liquids:</b> [receive_reagents ? "Enabled" : "Disabled"]<br>" //CHOMPstation edit // dispvoreprefs += "<b>Receiving liquids:</b> [receive_reagents ? "Enabled" : "Disabled"]<br>" //CHOMPstation edit
dispvoreprefs += "<b>Giving liquids:</b> [give_reagents ? "Enabled" : "Disabled"]<br>" //CHOMPstation edit // dispvoreprefs += "<b>Giving liquids:</b> [give_reagents ? "Enabled" : "Disabled"]<br>" //CHOMPstation edit
user << browse("<html><head><title>Vore prefs: [src]</title></head><body><center>[dispvoreprefs]</center></body></html>", "window=[name]mvp;size=200x300;can_resize=0;can_minimize=0") user << browse("<html><head><title>Vore prefs: [src]</title></head><body><center>[dispvoreprefs]</center></body></html>", "window=[name]mvp;size=200x300;can_resize=0;can_minimize=0")
onclose(user, "[name]") onclose(user, "[name]")
return return

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -159,7 +159,6 @@
#include "code\_onclick\drag_drop.dm" #include "code\_onclick\drag_drop.dm"
#include "code\_onclick\item_attack.dm" #include "code\_onclick\item_attack.dm"
#include "code\_onclick\observer.dm" #include "code\_onclick\observer.dm"
#include "code\_onclick\observer_vr.dm"
#include "code\_onclick\other_mobs.dm" #include "code\_onclick\other_mobs.dm"
#include "code\_onclick\rig.dm" #include "code\_onclick\rig.dm"
#include "code\_onclick\telekinesis.dm" #include "code\_onclick\telekinesis.dm"
@@ -2616,7 +2615,6 @@
#include "code\modules\mob\living\inventory.dm" #include "code\modules\mob\living\inventory.dm"
#include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\life.dm"
#include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_ch.dm"
#include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_defines.dm"
#include "code\modules\mob\living\living_defines_vr.dm" #include "code\modules\mob\living\living_defines_vr.dm"
@@ -2695,7 +2693,6 @@
#include "code\modules\mob\living\carbon\human\human_helpers.dm" #include "code\modules\mob\living\carbon\human\human_helpers.dm"
#include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" #include "code\modules\mob\living\carbon\human\human_helpers_vr.dm"
#include "code\modules\mob\living\carbon\human\human_movement.dm" #include "code\modules\mob\living\carbon\human\human_movement.dm"
#include "code\modules\mob\living\carbon\human\human_movement_ch.dm"
#include "code\modules\mob\living\carbon\human\human_organs.dm" #include "code\modules\mob\living\carbon\human\human_organs.dm"
#include "code\modules\mob\living\carbon\human\human_powers.dm" #include "code\modules\mob\living\carbon\human\human_powers.dm"
#include "code\modules\mob\living\carbon\human\human_powers_vr.dm" #include "code\modules\mob\living\carbon\human\human_powers_vr.dm"
@@ -3885,7 +3882,6 @@
#include "code\modules\vore\eating\contaminate_vr.dm" #include "code\modules\vore\eating\contaminate_vr.dm"
#include "code\modules\vore\eating\digest_act_vr.dm" #include "code\modules\vore\eating\digest_act_vr.dm"
#include "code\modules\vore\eating\leave_remains_vr.dm" #include "code\modules\vore\eating\leave_remains_vr.dm"
#include "code\modules\vore\eating\living_ch.dm"
#include "code\modules\vore\eating\living_vr.dm" #include "code\modules\vore\eating\living_vr.dm"
#include "code\modules\vore\eating\silicon_vr.dm" #include "code\modules\vore\eating\silicon_vr.dm"
#include "code\modules\vore\eating\simple_animal_vr.dm" #include "code\modules\vore\eating\simple_animal_vr.dm"