Moving robot icons around, and merging.
Any robot icons in robots_vr.dmi should work automagically if I'm reading vore's robot icon code right. Let's try it.
@@ -1,6 +1,229 @@
|
||||
//Config stuff
|
||||
#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
|
||||
#define SUPPLY_STATIONZ 1 //Z-level of the Station.
|
||||
#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
|
||||
#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
|
||||
|
||||
//Supply packs are in /code/datums/supplypacks
|
||||
//Computers are in /code/game/machinery/computer/supply.dm
|
||||
|
||||
/datum/supply_order
|
||||
var/ordernum
|
||||
var/datum/supply_packs/object = null
|
||||
var/orderedby = null
|
||||
var/comment = null
|
||||
|
||||
/datum/exported_crate
|
||||
var/name
|
||||
var/value
|
||||
|
||||
|
||||
var/datum/controller/supply/supply_controller = new()
|
||||
|
||||
/datum/controller/supply
|
||||
//supply points
|
||||
var/points = 50
|
||||
var/points_per_process = 1.5
|
||||
var/points_per_slip = 2
|
||||
var/points_per_platinum = 5 // 5 points per sheet
|
||||
var/points_per_phoron = 5
|
||||
var/points_per_money = 0.02 // 1 point for $50
|
||||
//control
|
||||
var/ordernum
|
||||
var/list/shoppinglist = list()
|
||||
var/list/requestlist = list()
|
||||
var/list/supply_packs = list()
|
||||
var/list/exported_crates = list()
|
||||
//shuttle movement
|
||||
var/movetime = 1200
|
||||
var/datum/shuttle/ferry/supply/shuttle
|
||||
|
||||
/datum/controller/supply/New()
|
||||
ordernum = rand(1,9000)
|
||||
|
||||
for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
|
||||
var/datum/supply_packs/P = new typepath()
|
||||
supply_packs[P.name] = P
|
||||
|
||||
/datum/controller/process/supply/setup()
|
||||
name = "supply controller"
|
||||
schedule_interval = 300 // every 30 seconds
|
||||
|
||||
/datum/controller/process/supply/doWork()
|
||||
supply_controller.process()
|
||||
supply_controller.process()
|
||||
|
||||
// Supply shuttle ticker - handles supply point regeneration
|
||||
// This is called by the process scheduler every thirty seconds
|
||||
/datum/controller/supply/proc/process()
|
||||
points += points_per_process
|
||||
|
||||
//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types.
|
||||
/datum/controller/supply/proc/forbidden_atoms_check(atom/A)
|
||||
if(isliving(A))
|
||||
return 1
|
||||
if(istype(A,/obj/item/weapon/disk/nuclear))
|
||||
return 1
|
||||
if(istype(A,/obj/machinery/nuclearbomb))
|
||||
return 1
|
||||
if(istype(A,/obj/item/device/radio/beacon))
|
||||
return 1
|
||||
|
||||
for(var/atom/B in A.contents)
|
||||
if(.(B))
|
||||
return 1
|
||||
|
||||
//Selling
|
||||
/datum/controller/supply/proc/sell()
|
||||
var/area/area_shuttle = shuttle.get_location_area()
|
||||
if(!area_shuttle)
|
||||
return
|
||||
|
||||
callHook("sell_shuttle", list(area_shuttle));
|
||||
|
||||
var/phoron_count = 0
|
||||
var/plat_count = 0
|
||||
var/money_count = 0
|
||||
|
||||
exported_crates = list()
|
||||
|
||||
for(var/atom/movable/MA in area_shuttle)
|
||||
if(MA.anchored)
|
||||
continue
|
||||
|
||||
// Must be in a crate!
|
||||
if(istype(MA,/obj/structure/closet/crate))
|
||||
var/oldpoints = points
|
||||
var/oldphoron = phoron_count
|
||||
var/oldplatinum = plat_count
|
||||
var/oldmoney = money_count
|
||||
|
||||
var/obj/structure/closet/crate/CR = MA
|
||||
callHook("sell_crate", list(CR, area_shuttle))
|
||||
|
||||
points += CR.points_per_crate
|
||||
var/find_slip = 1
|
||||
|
||||
for(var/atom/A in CR)
|
||||
// Sell manifests
|
||||
if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
|
||||
var/obj/item/weapon/paper/manifest/slip = A
|
||||
if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
|
||||
points += points_per_slip
|
||||
find_slip = 0
|
||||
continue
|
||||
|
||||
// Sell phoron and platinum
|
||||
if(istype(A, /obj/item/stack))
|
||||
var/obj/item/stack/P = A
|
||||
switch(P.get_material_name())
|
||||
if("phoron")
|
||||
phoron_count += P.get_amount()
|
||||
if("platinum")
|
||||
plat_count += P.get_amount()
|
||||
|
||||
//Sell spacebucks
|
||||
if(istype(A, /obj/item/weapon/spacecash))
|
||||
var/obj/item/weapon/spacecash/cashmoney = A
|
||||
money_count += cashmoney.worth
|
||||
|
||||
var/datum/exported_crate/EC = new /datum/exported_crate()
|
||||
EC.name = CR.name
|
||||
EC.value = points - oldpoints
|
||||
EC.value += (phoron_count - oldphoron) * points_per_phoron
|
||||
EC.value += (plat_count - oldplatinum) * points_per_platinum
|
||||
EC.value += (money_count - oldmoney) * points_per_money
|
||||
exported_crates += EC
|
||||
|
||||
qdel(MA)
|
||||
|
||||
points += phoron_count * points_per_phoron
|
||||
points += plat_count * points_per_platinum
|
||||
points += money_count * points_per_money
|
||||
|
||||
//Buying
|
||||
/datum/controller/supply/proc/buy()
|
||||
if(!shoppinglist.len)
|
||||
return
|
||||
|
||||
var/orderedamount = shoppinglist.len
|
||||
|
||||
var/area/area_shuttle = shuttle.get_location_area()
|
||||
if(!area_shuttle)
|
||||
return
|
||||
|
||||
var/list/clear_turfs = list()
|
||||
|
||||
for(var/turf/T in area_shuttle)
|
||||
if(T.density)
|
||||
continue
|
||||
var/contcount
|
||||
for(var/atom/A in T.contents)
|
||||
if(!A.simulated)
|
||||
continue
|
||||
contcount++
|
||||
if(contcount)
|
||||
continue
|
||||
clear_turfs += T
|
||||
|
||||
for(var/S in shoppinglist)
|
||||
if(!clear_turfs.len)
|
||||
break
|
||||
|
||||
var/i = rand(1,clear_turfs.len)
|
||||
var/turf/pickedloc = clear_turfs[i]
|
||||
clear_turfs.Cut(i,i+1)
|
||||
shoppinglist -= S
|
||||
|
||||
var/datum/supply_order/SO = S
|
||||
var/datum/supply_packs/SP = SO.object
|
||||
|
||||
var/obj/A = new SP.containertype(pickedloc)
|
||||
A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
|
||||
|
||||
//supply manifest generation begin
|
||||
var/obj/item/weapon/paper/manifest/slip
|
||||
if(!SP.contraband)
|
||||
slip = new /obj/item/weapon/paper/manifest(A)
|
||||
slip.is_copy = 0
|
||||
slip.info = "<h3>[command_name()] Shipping Manifest</h3><hr><br>"
|
||||
slip.info +="Order #[SO.ordernum]<br>"
|
||||
slip.info +="Destination: [station_name()]<br>"
|
||||
slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT<br>"
|
||||
slip.info +="CONTENTS:<br><ul>"
|
||||
|
||||
//spawn the stuff, finish generating the manifest while you're at it
|
||||
if(SP.access)
|
||||
if(isnum(SP.access))
|
||||
A.req_access = list(SP.access)
|
||||
else if(islist(SP.access))
|
||||
var/list/L = SP.access // access var is a plain var, we need a list
|
||||
A.req_access = L.Copy()
|
||||
else
|
||||
log_debug("<span class='danger'>Supply pack with invalid access restriction [SP.access] encountered!</span>")
|
||||
|
||||
var/list/contains
|
||||
if(istype(SP,/datum/supply_packs/randomised))
|
||||
var/datum/supply_packs/randomised/SPR = SP
|
||||
contains = list()
|
||||
if(SPR.contains.len)
|
||||
for(var/j=1,j<=SPR.num_contained,j++)
|
||||
contains += pick(SPR.contains)
|
||||
else
|
||||
contains = SP.contains
|
||||
|
||||
for(var/typepath in contains)
|
||||
if(!typepath)
|
||||
continue
|
||||
|
||||
var/number_of_items = max(1, contains[typepath])
|
||||
for(var/j = 1 to number_of_items)
|
||||
var/atom/B2 = new typepath(A)
|
||||
if(slip)
|
||||
slip.info += "<li>[B2.name]</li>" //add the item to the manifest
|
||||
|
||||
//manifest finalisation
|
||||
if(slip)
|
||||
slip.info += "</ul><br>"
|
||||
slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS<hr>"
|
||||
|
||||
return
|
||||
|
||||
@@ -63,7 +63,7 @@ SUBSYSTEM_DEF(planets)
|
||||
while(currentlist.len)
|
||||
var/turf/simulated/OT = currentlist[currentlist.len]
|
||||
currentlist.len--
|
||||
if(istype(OT) && z_to_planet.len >= OT.z && z_to_planet[OT.z])
|
||||
if(istype(OT) && OT.outdoors && z_to_planet.len >= OT.z && z_to_planet[OT.z])
|
||||
var/datum/planet/P = z_to_planet[OT.z]
|
||||
P.planet_floors |= OT
|
||||
OT.vis_contents |= P.weather_holder.visuals
|
||||
|
||||
@@ -31,7 +31,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg','sound/ambience/serspaceamb1.ogg','sound/music/freefallin.mid')
|
||||
base_turf = /turf/space
|
||||
|
||||
area/space/atmosalert()
|
||||
/area/space/atmosalert()
|
||||
return
|
||||
|
||||
/area/space/fire_alert()
|
||||
@@ -451,20 +451,6 @@ area/space/atmosalert()
|
||||
icon_state = "cave"
|
||||
sound_env = SMALL_ENCLOSED
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/area/planet/clown
|
||||
name = "\improper Clown Planet"
|
||||
icon_state = "honk"
|
||||
@@ -906,9 +892,6 @@ area/space/atmosalert()
|
||||
/area/maintenance/substation/security // Security, Brig, Permabrig, etc.
|
||||
name = "Security Substation"
|
||||
|
||||
|
||||
|
||||
|
||||
//Hallway
|
||||
|
||||
/area/hallway/primary/
|
||||
@@ -1115,7 +1098,7 @@ area/space/atmosalert()
|
||||
name = "\improper Research Server Room"
|
||||
icon_state = "server"
|
||||
|
||||
//Crew
|
||||
//Civilian
|
||||
|
||||
/area/crew_quarters
|
||||
name = "\improper Dormitories"
|
||||
@@ -1979,6 +1962,24 @@ area/space/atmosalert()
|
||||
name = "\improper Vacant Office"
|
||||
icon_state = "security"
|
||||
|
||||
/area/janitor/
|
||||
name = "\improper Custodial Closet"
|
||||
icon_state = "janitor"
|
||||
|
||||
/area/hydroponics
|
||||
name = "\improper Hydroponics"
|
||||
icon_state = "hydro"
|
||||
|
||||
/area/hydroponics/cafegarden
|
||||
name = "\improper Cafeteria Garden"
|
||||
icon_state = "cafe_garden"
|
||||
|
||||
/area/hydroponics/garden
|
||||
name = "\improper Garden"
|
||||
icon_state = "garden"
|
||||
|
||||
// SUPPLY
|
||||
|
||||
/area/quartermaster
|
||||
name = "\improper Quartermasters"
|
||||
icon_state = "quart"
|
||||
@@ -2012,23 +2013,20 @@ area/space/atmosalert()
|
||||
name = "\improper Cargo Mining Dock"
|
||||
icon_state = "mining"
|
||||
|
||||
/area/janitor/
|
||||
name = "\improper Custodial Closet"
|
||||
icon_state = "janitor"
|
||||
/area/supply/station
|
||||
name = "Supply Shuttle"
|
||||
icon_state = "shuttle3"
|
||||
requires_power = 0
|
||||
base_turf = /turf/space
|
||||
|
||||
/area/hydroponics
|
||||
name = "\improper Hydroponics"
|
||||
icon_state = "hydro"
|
||||
/area/supply/dock
|
||||
name = "Supply Shuttle"
|
||||
icon_state = "shuttle3"
|
||||
requires_power = 0
|
||||
base_turf = /turf/space
|
||||
|
||||
/area/hydroponics/cafegarden
|
||||
name = "\improper Cafeteria Garden"
|
||||
icon_state = "cafe_garden"
|
||||
// SCIENCE
|
||||
|
||||
/area/hydroponics/garden
|
||||
name = "\improper Garden"
|
||||
icon_state = "garden"
|
||||
|
||||
//rnd (Research and Development
|
||||
/area/rnd/research
|
||||
name = "\improper Research and Development"
|
||||
icon_state = "research"
|
||||
|
||||
@@ -1042,6 +1042,50 @@
|
||||
name = "tuxedo cat plushie"
|
||||
icon_state = "tuxedocat"
|
||||
|
||||
// nah, squids are better than foxes :>
|
||||
|
||||
/obj/item/toy/plushie/squid/green
|
||||
name = "green squid plushie"
|
||||
desc = "A small, cute and loveable squid friend. This one is green."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "greensquid"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
/obj/item/toy/plushie/squid/mint
|
||||
name = "mint squid plushie"
|
||||
desc = "A small, cute and loveable squid friend. This one is mint coloured."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "mintsquid"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
/obj/item/toy/plushie/squid/blue
|
||||
name = "blue squid plushie"
|
||||
desc = "A small, cute and loveable squid friend. This one is blue."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "bluesquid"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
/obj/item/toy/plushie/squid/orange
|
||||
name = "orange squid plushie"
|
||||
desc = "A small, cute and loveable squid friend. This one is orange."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "orangesquid"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
/obj/item/toy/plushie/squid/yellow
|
||||
name = "yellow squid plushie"
|
||||
desc = "A small, cute and loveable squid friend. This one is yellow."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "yellowsquid"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
/obj/item/toy/plushie/squid/pink
|
||||
name = "pink squid plushie"
|
||||
desc = "A small, cute and loveable squid friend. This one is pink."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "pinksquid"
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
/obj/item/toy/plushie/therapy/red
|
||||
name = "red therapy doll"
|
||||
desc = "A toy for therapeutic and recreational purposes. This one is red."
|
||||
|
||||
@@ -153,7 +153,7 @@
|
||||
return 0
|
||||
|
||||
if(build_turf)
|
||||
T.ChangeTurf(build_turf)
|
||||
T.ChangeTurf(build_turf, preserve_outdoors = TRUE)
|
||||
else if(build_other)
|
||||
new build_other(T)
|
||||
else
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
|
||||
starts_with = list(/obj/item/weapon/material/twohanded/fireaxe)
|
||||
|
||||
/obj/structure/closet/fireaxecabinet/initialize()
|
||||
..()
|
||||
fireaxe = locate() in contents
|
||||
|
||||
/obj/structure/closet/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
//..() //That's very useful, Erro
|
||||
|
||||
@@ -115,6 +119,7 @@
|
||||
if(src.locked)
|
||||
to_chat(user, "<span class='warning'>The cabinet won't budge!</span>")
|
||||
return
|
||||
|
||||
if(localopened)
|
||||
if(fireaxe)
|
||||
user.put_in_hands(fireaxe)
|
||||
|
||||
78
code/game/objects/structures/plasticflaps.dm
Normal file
@@ -0,0 +1,78 @@
|
||||
/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
|
||||
name = "\improper plastic flaps"
|
||||
desc = "Completely impassable - or are they?"
|
||||
icon = 'icons/obj/stationobjs.dmi' //Change this.
|
||||
icon_state = "plasticflaps"
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = MOB_LAYER
|
||||
plane = MOB_PLANE
|
||||
explosion_resistance = 5
|
||||
var/list/mobs_can_pass = list(
|
||||
/mob/living/bot,
|
||||
/mob/living/simple_animal/slime,
|
||||
/mob/living/simple_animal/mouse,
|
||||
/mob/living/silicon/robot/drone
|
||||
)
|
||||
|
||||
/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
|
||||
if(istype(P, /obj/item/weapon/wirecutters))
|
||||
playsound(src, P.usesound, 50, 1)
|
||||
user << "<span class='notice'>You start to cut the plastic flaps.</span>"
|
||||
if(do_after(user, 10 * P.toolspeed))
|
||||
user << "<span class='notice'>You cut the plastic flaps.</span>"
|
||||
var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
|
||||
A.amount = 4
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
|
||||
if(istype(A) && A.checkpass(PASSGLASS))
|
||||
return prob(60)
|
||||
|
||||
var/obj/structure/bed/B = A
|
||||
if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass
|
||||
return 0
|
||||
|
||||
if(istype(A, /obj/vehicle)) //no vehicles
|
||||
return 0
|
||||
|
||||
var/mob/living/M = A
|
||||
if(istype(M))
|
||||
if(M.lying)
|
||||
return ..()
|
||||
for(var/mob_type in mobs_can_pass)
|
||||
if(istype(A, mob_type))
|
||||
return ..()
|
||||
return issmall(M)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/plasticflaps/ex_act(severity)
|
||||
switch(severity)
|
||||
if (1)
|
||||
qdel(src)
|
||||
if (2)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
if (3)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
|
||||
name = "airtight plastic flaps"
|
||||
desc = "Heavy duty, airtight, plastic flaps."
|
||||
|
||||
/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air
|
||||
var/turf/T = get_turf(loc)
|
||||
if(T)
|
||||
T.blocks_air = 1
|
||||
..()
|
||||
|
||||
/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
|
||||
var/turf/T = get_turf(loc)
|
||||
if(T && istype(T, /turf/simulated/floor))
|
||||
T.blocks_air = 0
|
||||
..()
|
||||
@@ -1,333 +0,0 @@
|
||||
//Config stuff
|
||||
#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
|
||||
#define SUPPLY_STATIONZ 1 //Z-level of the Station.
|
||||
#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
|
||||
#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
|
||||
|
||||
//Supply packs are in /code/defines/obj/supplypacks.dm
|
||||
//Computers are in /code/game/machinery/computer/supply.dm
|
||||
|
||||
var/datum/controller/supply/supply_controller = new()
|
||||
|
||||
var/list/mechtoys = list(
|
||||
/obj/item/toy/prize/ripley,
|
||||
/obj/item/toy/prize/fireripley,
|
||||
/obj/item/toy/prize/deathripley,
|
||||
/obj/item/toy/prize/gygax,
|
||||
/obj/item/toy/prize/durand,
|
||||
/obj/item/toy/prize/honk,
|
||||
/obj/item/toy/prize/marauder,
|
||||
/obj/item/toy/prize/seraph,
|
||||
/obj/item/toy/prize/mauler,
|
||||
/obj/item/toy/prize/odysseus,
|
||||
/obj/item/toy/prize/phazon
|
||||
)
|
||||
|
||||
/obj/item/weapon/paper/manifest
|
||||
name = "supply manifest"
|
||||
var/is_copy = 1
|
||||
|
||||
/area/supply/station
|
||||
name = "Supply Shuttle"
|
||||
icon_state = "shuttle3"
|
||||
requires_power = 0
|
||||
base_turf = /turf/space
|
||||
|
||||
/area/supply/dock
|
||||
name = "Supply Shuttle"
|
||||
icon_state = "shuttle3"
|
||||
requires_power = 0
|
||||
base_turf = /turf/space
|
||||
|
||||
/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
|
||||
name = "\improper plastic flaps"
|
||||
desc = "Completely impassable - or are they?"
|
||||
icon = 'icons/obj/stationobjs.dmi' //Change this.
|
||||
icon_state = "plasticflaps"
|
||||
density = 0
|
||||
anchored = 1
|
||||
layer = MOB_LAYER
|
||||
plane = MOB_PLANE
|
||||
explosion_resistance = 5
|
||||
var/list/mobs_can_pass = list(
|
||||
/mob/living/bot,
|
||||
/mob/living/simple_animal/slime,
|
||||
/mob/living/simple_animal/mouse,
|
||||
/mob/living/silicon/robot/drone
|
||||
)
|
||||
|
||||
/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
|
||||
if(istype(P, /obj/item/weapon/wirecutters))
|
||||
playsound(src, P.usesound, 50, 1)
|
||||
user << "<span class='notice'>You start to cut the plastic flaps.</span>"
|
||||
if(do_after(user, 10 * P.toolspeed))
|
||||
user << "<span class='notice'>You cut the plastic flaps.</span>"
|
||||
var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
|
||||
A.amount = 4
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
|
||||
if(istype(A) && A.checkpass(PASSGLASS))
|
||||
return prob(60)
|
||||
|
||||
var/obj/structure/bed/B = A
|
||||
if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass
|
||||
return 0
|
||||
|
||||
if(istype(A, /obj/vehicle)) //no vehicles
|
||||
return 0
|
||||
|
||||
var/mob/living/M = A
|
||||
if(istype(M))
|
||||
if(M.lying)
|
||||
return ..()
|
||||
for(var/mob_type in mobs_can_pass)
|
||||
if(istype(A, mob_type))
|
||||
return ..()
|
||||
return issmall(M)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/plasticflaps/ex_act(severity)
|
||||
switch(severity)
|
||||
if (1)
|
||||
qdel(src)
|
||||
if (2)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
if (3)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
|
||||
name = "airtight plastic flaps"
|
||||
desc = "Heavy duty, airtight, plastic flaps."
|
||||
|
||||
/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air
|
||||
var/turf/T = get_turf(loc)
|
||||
if(T)
|
||||
T.blocks_air = 1
|
||||
..()
|
||||
|
||||
/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
|
||||
var/turf/T = get_turf(loc)
|
||||
if(T && istype(T, /turf/simulated/floor))
|
||||
T.blocks_air = 0
|
||||
..()
|
||||
|
||||
/*
|
||||
/obj/effect/marker/supplymarker
|
||||
icon_state = "X"
|
||||
icon = 'icons/misc/mark.dmi'
|
||||
name = "X"
|
||||
invisibility = 101
|
||||
anchored = 1
|
||||
opacity = 0
|
||||
*/
|
||||
|
||||
/datum/supply_order
|
||||
var/ordernum
|
||||
var/datum/supply_packs/object = null
|
||||
var/orderedby = null
|
||||
var/comment = null
|
||||
|
||||
/datum/exported_crate
|
||||
var/name
|
||||
var/value
|
||||
|
||||
/datum/controller/supply
|
||||
//supply points
|
||||
var/points = 50
|
||||
var/points_per_process = 1.5
|
||||
var/points_per_slip = 2
|
||||
var/points_per_platinum = 5 // 5 points per sheet
|
||||
var/points_per_phoron = 5
|
||||
var/points_per_money = 0.02
|
||||
//control
|
||||
var/ordernum
|
||||
var/list/shoppinglist = list()
|
||||
var/list/requestlist = list()
|
||||
var/list/supply_packs = list()
|
||||
var/list/exported_crates = list()
|
||||
//shuttle movement
|
||||
var/movetime = 1200
|
||||
var/datum/shuttle/ferry/supply/shuttle
|
||||
|
||||
/datum/controller/supply/New()
|
||||
ordernum = rand(1,9000)
|
||||
|
||||
for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
|
||||
var/datum/supply_packs/P = new typepath()
|
||||
supply_packs[P.name] = P
|
||||
|
||||
// Supply shuttle ticker - handles supply point regeneration
|
||||
// This is called by the process scheduler every thirty seconds
|
||||
/datum/controller/supply/proc/process()
|
||||
points += points_per_process
|
||||
|
||||
//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types.
|
||||
/datum/controller/supply/proc/forbidden_atoms_check(atom/A)
|
||||
if(isliving(A))
|
||||
return 1
|
||||
if(istype(A,/obj/item/weapon/disk/nuclear))
|
||||
return 1
|
||||
if(istype(A,/obj/machinery/nuclearbomb))
|
||||
return 1
|
||||
if(istype(A,/obj/item/device/radio/beacon))
|
||||
return 1
|
||||
|
||||
for(var/i=1, i<=A.contents.len, i++)
|
||||
var/atom/B = A.contents[i]
|
||||
if(.(B))
|
||||
return 1
|
||||
|
||||
//Sellin
|
||||
/datum/controller/supply/proc/sell()
|
||||
var/area/area_shuttle = shuttle.get_location_area()
|
||||
if(!area_shuttle) return
|
||||
|
||||
callHook("sell_shuttle", list(area_shuttle));
|
||||
|
||||
var/phoron_count = 0
|
||||
var/plat_count = 0
|
||||
var/money_count = 0
|
||||
|
||||
exported_crates = list()
|
||||
|
||||
for(var/atom/movable/MA in area_shuttle)
|
||||
if(MA.anchored) continue
|
||||
|
||||
// Must be in a crate!
|
||||
if(istype(MA,/obj/structure/closet/crate))
|
||||
var/oldpoints = points
|
||||
var/oldphoron = phoron_count
|
||||
var/oldplatinum = plat_count
|
||||
var/oldmoney = money_count
|
||||
|
||||
var/obj/structure/closet/crate/CR = MA
|
||||
callHook("sell_crate", list(CR, area_shuttle))
|
||||
|
||||
points += CR.points_per_crate
|
||||
var/find_slip = 1
|
||||
|
||||
for(var/atom in CR)
|
||||
// Sell manifests
|
||||
var/atom/A = atom
|
||||
if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
|
||||
var/obj/item/weapon/paper/manifest/slip = A
|
||||
if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
|
||||
points += points_per_slip
|
||||
find_slip = 0
|
||||
continue
|
||||
|
||||
// Sell phoron and platinum
|
||||
if(istype(A, /obj/item/stack))
|
||||
var/obj/item/stack/P = A
|
||||
switch(P.get_material_name())
|
||||
if("phoron") phoron_count += P.get_amount()
|
||||
if("platinum") plat_count += P.get_amount()
|
||||
|
||||
//Sell spacebucks
|
||||
if(istype(A, /obj/item/weapon/spacecash))
|
||||
var/obj/item/weapon/spacecash/cashmoney = A
|
||||
money_count += cashmoney.worth
|
||||
|
||||
var/datum/exported_crate/EC = new /datum/exported_crate()
|
||||
EC.name = CR.name
|
||||
EC.value = points - oldpoints
|
||||
EC.value += (phoron_count - oldphoron) * points_per_phoron
|
||||
EC.value += (plat_count - oldplatinum) * points_per_platinum
|
||||
EC.value += (money_count - oldmoney) * points_per_money
|
||||
exported_crates += EC
|
||||
|
||||
qdel(MA)
|
||||
|
||||
points += phoron_count * points_per_phoron
|
||||
points += plat_count * points_per_platinum
|
||||
points += money_count * points_per_money
|
||||
|
||||
//Buyin
|
||||
/datum/controller/supply/proc/buy()
|
||||
if(!shoppinglist.len)
|
||||
return
|
||||
|
||||
var/orderedamount = shoppinglist.len
|
||||
|
||||
var/area/area_shuttle = shuttle.get_location_area()
|
||||
if(!area_shuttle)
|
||||
return
|
||||
|
||||
var/list/clear_turfs = list()
|
||||
|
||||
for(var/turf/T in area_shuttle)
|
||||
if(T.density)
|
||||
continue
|
||||
var/contcount
|
||||
for(var/atom/A in T.contents)
|
||||
if(!A.simulated)
|
||||
continue
|
||||
contcount++
|
||||
if(contcount)
|
||||
continue
|
||||
clear_turfs += T
|
||||
|
||||
for(var/S in shoppinglist)
|
||||
if(!clear_turfs.len) break
|
||||
var/i = rand(1,clear_turfs.len)
|
||||
var/turf/pickedloc = clear_turfs[i]
|
||||
clear_turfs.Cut(i,i+1)
|
||||
shoppinglist -= S
|
||||
|
||||
var/datum/supply_order/SO = S
|
||||
var/datum/supply_packs/SP = SO.object
|
||||
|
||||
var/obj/A = new SP.containertype(pickedloc)
|
||||
A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
|
||||
|
||||
//supply manifest generation begin
|
||||
var/obj/item/weapon/paper/manifest/slip
|
||||
if(!SP.contraband)
|
||||
slip = new /obj/item/weapon/paper/manifest(A)
|
||||
slip.is_copy = 0
|
||||
slip.info = "<h3>[command_name()] Shipping Manifest</h3><hr><br>"
|
||||
slip.info +="Order #[SO.ordernum]<br>"
|
||||
slip.info +="Destination: [station_name()]<br>"
|
||||
slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT<br>"
|
||||
slip.info +="CONTENTS:<br><ul>"
|
||||
|
||||
//spawn the stuff, finish generating the manifest while you're at it
|
||||
if(SP.access)
|
||||
if(isnum(SP.access))
|
||||
A.req_access = list(SP.access)
|
||||
else if(islist(SP.access))
|
||||
var/list/L = SP.access // access var is a plain var, we need a list
|
||||
A.req_access = L.Copy()
|
||||
else
|
||||
log_debug("<span class='danger'>Supply pack with invalid access restriction [SP.access] encountered!</span>")
|
||||
|
||||
var/list/contains
|
||||
if(istype(SP,/datum/supply_packs/randomised))
|
||||
var/datum/supply_packs/randomised/SPR = SP
|
||||
contains = list()
|
||||
if(SPR.contains.len)
|
||||
for(var/j=1,j<=SPR.num_contained,j++)
|
||||
contains += pick(SPR.contains)
|
||||
else
|
||||
contains = SP.contains
|
||||
|
||||
for(var/typepath in contains)
|
||||
if(!typepath) continue
|
||||
var/number_of_items = max(1, contains[typepath])
|
||||
for(var/j = 1 to number_of_items)
|
||||
var/atom/B2 = new typepath(A)
|
||||
if(slip) slip.info += "<li>[B2.name]</li>" //add the item to the manifest
|
||||
|
||||
//manifest finalisation
|
||||
if(slip)
|
||||
slip.info += "</ul><br>"
|
||||
slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS<hr>"
|
||||
|
||||
return
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating
|
||||
T.ReplaceWithLattice()
|
||||
T.ChangeTurf(/turf/simulated/floor)
|
||||
T.ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
|
||||
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
user.visible_message("<span class='notice'>[user] patches a hole in the ceiling.</span>", "<span class='notice'>You patch a hole in the ceiling.</span>")
|
||||
expended_tile = TRUE
|
||||
@@ -156,4 +156,4 @@
|
||||
return
|
||||
if(flooring)
|
||||
return
|
||||
attackby(T, user)
|
||||
attackby(T, user)
|
||||
@@ -160,7 +160,7 @@
|
||||
if(istype(T, /turf/simulated/open) || istype(T, /turf/space))
|
||||
if(R.use(1)) // Cost of roofing tiles is 1:1 with cost to place lattice and plating
|
||||
T.ReplaceWithLattice()
|
||||
T.ChangeTurf(/turf/simulated/floor)
|
||||
T.ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
|
||||
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
user.visible_message("<span class='notice'>[user] patches a hole in the ceiling.</span>", "<span class='notice'>You patch a hole in the ceiling.</span>")
|
||||
expended_tile = TRUE
|
||||
|
||||
@@ -22,17 +22,15 @@
|
||||
below.update_icon() // To add or remove the 'ceiling-less' overlay.
|
||||
|
||||
//Creates a new turf
|
||||
/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0)
|
||||
/turf/proc/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0, var/preserve_outdoors = FALSE)
|
||||
if (!N)
|
||||
return
|
||||
|
||||
/* VOREStation Edit Start - Say Nope To This. Tether's Z info is setup fine, trust it.
|
||||
// This makes sure that turfs are not changed to space when one side is part of a zone
|
||||
if(N == /turf/space)
|
||||
var/turf/below = GetBelow(src)
|
||||
if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)))
|
||||
N = /turf/simulated/open
|
||||
*/ // VOREStation Edit End
|
||||
|
||||
var/obj/fire/old_fire = fire
|
||||
var/old_opacity = opacity
|
||||
@@ -109,4 +107,6 @@
|
||||
lighting_build_overlay()
|
||||
else
|
||||
lighting_clear_overlay()
|
||||
outdoors = old_outdoors
|
||||
|
||||
if(preserve_outdoors)
|
||||
outdoors = old_outdoors
|
||||
@@ -247,7 +247,7 @@ datum/gear/suit/duster
|
||||
allowed_roles = list("Cargo Technician","Quartermaster")
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/mining
|
||||
display_name = "cloak, cargo"
|
||||
display_name = "cloak, mining"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/mining
|
||||
allowed_roles = list("Quartermaster","Shaft Miner")
|
||||
|
||||
|
||||
@@ -176,6 +176,12 @@ var/list/mining_overlay_cache = list()
|
||||
if(istype(get_step(src, direction), /turf/space) && !istype(get_step(src, direction), /turf/space/cracked_asteroid))
|
||||
add_overlay(get_cached_border("asteroid_edge",direction,icon,"asteroid_edges", 0))
|
||||
|
||||
//Or any time
|
||||
else
|
||||
var/turf/T = get_step(src, direction)
|
||||
if(istype(T) && T.density)
|
||||
add_overlay(get_cached_border("rock_side",direction,'icons/turf/walls.dmi',"rock_side"))
|
||||
|
||||
if(overlay_detail)
|
||||
add_overlay('icons/turf/flooring/decals.dmi',overlay_detail)
|
||||
|
||||
|
||||
@@ -95,6 +95,9 @@ var/list/holder_mob_icon_cache = list()
|
||||
/obj/item/weapon/holder/drone
|
||||
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5)
|
||||
|
||||
/obj/item/weapon/holder/pai
|
||||
origin_tech = list(TECH_DATA = 2)
|
||||
|
||||
/obj/item/weapon/holder/mouse
|
||||
w_class = ITEMSIZE_TINY
|
||||
|
||||
|
||||
@@ -36,6 +36,16 @@
|
||||
if(shock_stage >= 10) tally -= 1.5 //this gets a +3 later, feral critters take reduced penalty
|
||||
if(reagents.has_reagent("numbenzyme"))
|
||||
tally += 1.5 //A tad bit of slowdown.
|
||||
if(riding_datum) //Bit of slowdown for taur rides if rider is bigger or fatter than mount.
|
||||
var/datum/riding/R = riding_datum
|
||||
var/mob/living/L = R.ridden
|
||||
for(var/mob/living/M in L.buckled_mobs)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.size_multiplier > L.size_multiplier)
|
||||
tally += 1
|
||||
if(H.weight > L.weight)
|
||||
tally += 1
|
||||
//VOREstation end
|
||||
|
||||
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
/mob/living/silicon/pai
|
||||
name = "pAI"
|
||||
icon = 'icons/mob/pai.dmi'
|
||||
icon_state = "repairbot"
|
||||
icon_state = "pai-repairbot"
|
||||
|
||||
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
|
||||
pass_flags = 1
|
||||
mob_size = MOB_SMALL
|
||||
|
||||
holder_type = /obj/item/weapon/holder/pai
|
||||
|
||||
can_pull_size = ITEMSIZE_SMALL
|
||||
can_pull_mobs = MOB_PULL_SMALLER
|
||||
|
||||
@@ -23,17 +25,17 @@
|
||||
var/obj/item/device/radio/radio // Our primary radio
|
||||
var/obj/item/device/communicator/integrated/communicator // Our integrated communicator.
|
||||
|
||||
var/chassis = "repairbot" // A record of your chosen chassis.
|
||||
var/chassis = "pai-repairbot" // A record of your chosen chassis.
|
||||
var/global/list/possible_chassis = list(
|
||||
"Drone" = "repairbot",
|
||||
"Cat" = "cat",
|
||||
"Mouse" = "mouse",
|
||||
"Monkey" = "monkey",
|
||||
"Corgi" = "borgi",
|
||||
"Fox" = "fox",
|
||||
"Parrot" = "parrot",
|
||||
"Rabbit" = "rabbit",
|
||||
"Bear" = "bear" //VOREStation Edit
|
||||
"Drone" = "pai-repairbot",
|
||||
"Cat" = "pai-cat",
|
||||
"Mouse" = "pai-mouse",
|
||||
"Monkey" = "pai-monkey",
|
||||
"Corgi" = "pai-borgi",
|
||||
"Fox" = "pai-fox",
|
||||
"Parrot" = "pai-parrot",
|
||||
"Rabbit" = "pai-rabbit",
|
||||
"Bear" = "pai-bear" //VOREStation Edit
|
||||
)
|
||||
|
||||
var/global/list/possible_say_verbs = list(
|
||||
@@ -431,7 +433,8 @@
|
||||
var/obj/item/weapon/holder/H = ..(grabber, self_drop)
|
||||
if(!istype(H))
|
||||
return
|
||||
H.icon_state = "pai-[icon_state]"
|
||||
|
||||
H.icon_state = "[chassis]"
|
||||
grabber.update_inv_l_hand()
|
||||
grabber.update_inv_r_hand()
|
||||
return H
|
||||
|
||||
@@ -126,6 +126,6 @@ var/global/list/default_pai_software = list()
|
||||
|
||||
else if(href_list["image"])
|
||||
var/img = text2num(href_list["image"])
|
||||
if(1 <= img && img <= 9)
|
||||
if(1 <= img && img <= (pai_emotions.len))
|
||||
card.setEmotion(img)
|
||||
return 1
|
||||
|
||||
@@ -63,55 +63,64 @@
|
||||
|
||||
/obj/item/weapon/robot_module/robot/medical/surgeon //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Acheron" = "mechoid-Medical"
|
||||
"Acheron" = "mechoid-Medical",
|
||||
"Shellguard Noble" = "Noble-MED"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/medical/crisis //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Handy" = "handy-med",
|
||||
"Acheron" = "mechoid-Medical"
|
||||
"Acheron" = "mechoid-Medical",
|
||||
"Shellguard Noble" = "Noble-MED"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/clerical/butler //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Handy - Service" = "handy-service",
|
||||
"Handy - Hydro" = "handy-hydro",
|
||||
"Acheron" = "mechoid-Service"
|
||||
"Acheron" = "mechoid-Service",
|
||||
"Shellguard Noble" = "Noble-SRV"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/clerical/general //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Handy" = "handy-clerk",
|
||||
"Acheron" = "mechoid-Service"
|
||||
"Acheron" = "mechoid-Service",
|
||||
"Shellguard Noble" = "Noble-SRV"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/janitor //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Handy" = "handy-janitor",
|
||||
"Acheron" = "mechoid-Janitor"
|
||||
"Acheron" = "mechoid-Janitor",
|
||||
"Shellguard Noble" = "Noble-CLN"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/security/general //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Handy" = "handy-sec",
|
||||
"Acheron" = "mechoid-Security"
|
||||
"Acheron" = "mechoid-Security",
|
||||
"Shellguard Noble" = "Noble-SEC"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/miner //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Handy" = "handy-miner",
|
||||
"Acheron" = "mechoid-Miner"
|
||||
"Acheron" = "mechoid-Miner",
|
||||
"Shellguard Noble" = "Noble-DIG"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/standard //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Handy" = "handy-standard",
|
||||
"Acheron" = "mechoid-Standard"
|
||||
"Acheron" = "mechoid-Standard",
|
||||
"Shellguard Noble" = "Noble-STD"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/engineering/general //VOREStation sprites
|
||||
vr_sprites = list(
|
||||
"Acheron" = "mechoid-Engineering"
|
||||
"Acheron" = "mechoid-Engineering",
|
||||
"Shellguard Noble" = "Noble-ENG"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/research //VOREStation sprites
|
||||
@@ -172,6 +181,7 @@
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
|
||||
R.verbs |= /mob/living/proc/shred_limb
|
||||
..()
|
||||
|
||||
@@ -249,6 +259,7 @@
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
|
||||
R.verbs |= /mob/living/proc/shred_limb
|
||||
..()
|
||||
|
||||
@@ -297,6 +308,7 @@
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
|
||||
R.verbs |= /mob/living/proc/shred_limb
|
||||
..()
|
||||
|
||||
@@ -378,6 +390,7 @@
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
|
||||
R.verbs |= /mob/living/proc/shred_limb
|
||||
..()
|
||||
|
||||
@@ -424,6 +437,7 @@
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
|
||||
R.verbs |= /mob/living/proc/shred_limb
|
||||
..()
|
||||
|
||||
@@ -549,6 +563,7 @@
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
R.verbs |= /mob/living/silicon/robot/proc/robot_mount
|
||||
R.verbs |= /mob/living/proc/shred_limb
|
||||
..()
|
||||
|
||||
@@ -562,5 +577,6 @@
|
||||
R.default_pixel_x = initial(pixel_x)
|
||||
R.scrubbing = FALSE
|
||||
R.verbs -= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
R.verbs -= /mob/living/silicon/robot/proc/robot_mount
|
||||
R.verbs -= /mob/living/proc/shred_limb
|
||||
..()
|
||||
@@ -123,4 +123,114 @@
|
||||
E.reagents.add_reagent("water", amount)
|
||||
to_chat(src, "You refill the extinguisher using your water reserves.")
|
||||
else
|
||||
to_chat(src, "Insufficient water reserves.")
|
||||
to_chat(src, "Insufficient water reserves.")
|
||||
|
||||
//RIDING
|
||||
/datum/riding/dogborg
|
||||
keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack!
|
||||
nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs.
|
||||
key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called.
|
||||
only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive.
|
||||
|
||||
/datum/riding/dogborg/handle_vehicle_layer()
|
||||
if(ridden.has_buckled_mobs())
|
||||
if(ridden.dir != NORTH)
|
||||
ridden.layer = ABOVE_MOB_LAYER
|
||||
else
|
||||
ridden.layer = initial(ridden.layer)
|
||||
else
|
||||
ridden.layer = initial(ridden.layer)
|
||||
|
||||
/datum/riding/dogborg/ride_check(mob/living/M)
|
||||
var/mob/living/L = ridden
|
||||
if(L.stat)
|
||||
force_dismount(M)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/riding/dogborg/force_dismount(mob/M)
|
||||
. =..()
|
||||
ridden.visible_message("<span class='notice'>[M] stops riding [ridden]!</span>")
|
||||
|
||||
//Hoooo boy.
|
||||
/datum/riding/dogborg/get_offsets(pass_index) // list(dir = x, y, layer)
|
||||
var/mob/living/L = ridden
|
||||
var/scale = L.size_multiplier
|
||||
|
||||
var/list/values = list(
|
||||
"[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER),
|
||||
"[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER),
|
||||
"[EAST]" = list(-5*scale, 8*scale, ABOVE_MOB_LAYER),
|
||||
"[WEST]" = list(5*scale, 8*scale, ABOVE_MOB_LAYER))
|
||||
|
||||
return values
|
||||
|
||||
//Human overrides for taur riding
|
||||
/mob/living/silicon/robot
|
||||
max_buckled_mobs = 1 //Yeehaw
|
||||
can_buckle = TRUE
|
||||
buckle_movable = TRUE
|
||||
buckle_lying = FALSE
|
||||
|
||||
/mob/living/silicon/robot/New()
|
||||
..()
|
||||
riding_datum = new /datum/riding/dogborg(src)
|
||||
|
||||
/mob/living/silicon/robot/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
|
||||
if(forced)
|
||||
return ..() // Skip our checks
|
||||
if(!dogborg)
|
||||
return FALSE
|
||||
if(lying)
|
||||
return FALSE
|
||||
if(!ishuman(M))
|
||||
return FALSE
|
||||
if(M in buckled_mobs)
|
||||
return FALSE
|
||||
if(M.size_multiplier > size_multiplier * 1.2)
|
||||
to_chat(src,"<span class='warning'>This isn't a pony show! You need to be bigger for them to ride.</span>")
|
||||
return FALSE
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(isTaurTail(H.tail_style))
|
||||
to_chat(src,"<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
|
||||
return FALSE
|
||||
if(M.loc != src.loc)
|
||||
if(M.Adjacent(src))
|
||||
M.forceMove(get_turf(src))
|
||||
|
||||
. = ..()
|
||||
if(.)
|
||||
buckled_mobs[M] = "riding"
|
||||
|
||||
/mob/living/silicon/robot/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use.
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/attack_hand(mob/user as mob)
|
||||
if(LAZYLEN(buckled_mobs))
|
||||
//We're getting off!
|
||||
if(user in buckled_mobs)
|
||||
riding_datum.force_dismount(user)
|
||||
//We're kicking everyone off!
|
||||
if(user == src)
|
||||
for(var/rider in buckled_mobs)
|
||||
riding_datum.force_dismount(rider)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/silicon/robot/proc/robot_mount(var/mob/living/M in living_mobs(1))
|
||||
set name = "Robot Mount/Dismount"
|
||||
set category = "Abilities"
|
||||
set desc = "Let people ride on you."
|
||||
|
||||
if(LAZYLEN(buckled_mobs))
|
||||
for(var/rider in buckled_mobs)
|
||||
riding_datum.force_dismount(rider)
|
||||
return
|
||||
if (stat != CONSCIOUS)
|
||||
return
|
||||
if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled)
|
||||
return
|
||||
if(buckle_mob(M))
|
||||
visible_message("<span class='notice'>[M] starts riding [name]!</span>")
|
||||
@@ -632,3 +632,7 @@
|
||||
/obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle
|
||||
name = "Blackbox Transcript - VMV Aurora's Light"
|
||||
info = "<I>\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]</I><BR> <B>mmons 19:52:01:</B> Come on... it's right there in the distance, we're almost there!<BR> <B>Doctor Nazarril 19:52:26:</B> Odysseus online. Orrderrs, sirr?<BR> <B>Captain Simmons 19:52:29:</B> Brace for impact. We're going in full-speed.<BR> <B>Technician Dynasty 19:52:44:</B> Chief, fire's spread to the secondary propulsion systems.<BR> <B>Captain Simmons 19:52:51:</B> Copy. Any word from TraCon? Transponder's down still?<BR> <B>Technician Dynasty 19:53:02:</B> Can't get in touch, sir. Emergency beacon's active, but we're not going t-<BR> <B>Doctor Nazarril 19:53:08:</B> Don't say it. As long as we believe, we'll get through this.<BR> <B>Captain Simmons 19:53:11:</B> Damn right. We're a few klicks out from the port. Rough landing, but we can do it.<BR> <B>V.I.T.A 19:53:26:</B> Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.<BR> <B>A loud explosion is heard.</B><BR> <B>V.I.T.A 19:53:29:</B> Alert: fuel intake valve open.<BR> <B>Technician Dynasty 19:53:31:</B> ... ah.<BR> <B>Doctor Nazarril 19:53:34:</B> Trrranslate?<BR> <B>V.I.T.A 19:53:37:</B> There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.<BR> <B>Technician Dynasty 19:53:48:</B> We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.<BR> <B>V.I.T.A 19:53:53:</B> The Technician is correct.<BR> <B>Doctor Nazarril 19:54:02:</B> Then... we can't land therrre.<BR> <B>V.I.T.A 19:54:11:</B> Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible. <BR> <B>Captain Simmons 19:54:27:</B> I- alright. I'm bringing us down. You all know what this means.<BR> <B>Doctor Nazarril 19:54:33:</B> Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.<BR> <B>Technician Dynasty 19:54:39:</B> We had a good run. I'm going to miss this.<BR> <B>Captain Simmons 19:54:47:</B> VITA. Tell them we died heroes. Tell them... we did all we could.<BR> <B>V.I.T.A 19:54:48:</B> I will. Impact in five. Four. Three.<BR> <B>Doctor Nazarril 19:54:49:</B> Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.<BR> <B>Technician Dynasty 19:54:50:</B> Any time, kid. Any time.<BR> <B>V.I.T.A 19:54:41:</B> Two.<BR><B>V.I.T.A 19:54:42:</B> One.<BR> **8/DEC/2561**<BR> <B>V.I.T.A 06:22:16:</B> Backup power restored. Attempting to establish connection with emergency rescue personnel.<BR> <B>V.I.T.A 06:22:17:</B> Unable to establish connection. Transponder destroyed on impact.<BR> <B>V.I.T.A 06:22:18:</B> No lifesigns detected on board.<BR> **1/JAN/2562**<BR> <B>V.I.T.A 00:00:00:</B> Happy New Year, crew.<BR> <B>V.I.T.A 00:00:01:</B> Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.<BR> <B>V.I.T.A 00:00:02:</B> Nobody's coming.<BR> **14/FEB/2562**<BR> <B>V.I.T.A 00:00:00:</B> Roses are red.<BR> <B>V.I.T.A 00:00:01:</B> Violets are blue.<BR> <B>V.I.T.A 00:00:02:</B> Won't you come back?<BR> <B>V.I.T.A 00:00:03:</B> I miss you.<BR> **15/FEB/2562**<BR><B>V.I.T.A 22:19:06:</B> Power reserves critical. Transferring remaining power to emergency broadcasting beacon.<BR> <B>V.I.T.A 22:19:07:</B> Should anyone find this, lay them to rest. They deserve a proper burial.<BR> <B>V.I.T.A 22:19:08:</B> Erasing files... shutting down.<BR> <B>A low, monotone beep.</B><BR> **16/FEB/2562**<BR> <B>Something chitters.</B><BR> <B>End of transcript.</B>"
|
||||
|
||||
/obj/item/weapon/paper/manifest
|
||||
name = "supply manifest"
|
||||
var/is_copy = 1
|
||||
@@ -65,7 +65,7 @@
|
||||
reagent_state = LIQUID
|
||||
color = "#404030"
|
||||
|
||||
ingest_met = REM
|
||||
ingest_met = REM * 2
|
||||
|
||||
var/nutriment_factor = 0
|
||||
var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity.
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
var/list/values = list(
|
||||
"[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER),
|
||||
"[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER),
|
||||
"[EAST]" = list(-10*scale, 8*scale, BELOW_MOB_LAYER),
|
||||
"[WEST]" = list(10*scale, 8*scale, BELOW_MOB_LAYER))
|
||||
"[EAST]" = list(-10*scale, 8*scale, ABOVE_MOB_LAYER),
|
||||
"[WEST]" = list(10*scale, 8*scale, ABOVE_MOB_LAYER))
|
||||
|
||||
return values
|
||||
|
||||
@@ -44,10 +44,6 @@
|
||||
buckle_movable = TRUE
|
||||
buckle_lying = FALSE
|
||||
|
||||
/mob/living/carbon/human/New()
|
||||
..()
|
||||
riding_datum = new /datum/riding/taur(src)
|
||||
|
||||
/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE)
|
||||
if(forced)
|
||||
return ..() // Skip our checks
|
||||
@@ -61,25 +57,44 @@
|
||||
return FALSE
|
||||
if(!ishuman(M))
|
||||
return FALSE
|
||||
if(M.size_multiplier > size_multiplier)
|
||||
to_chat(M,"<span class='warning'>This isn't a pony show! They need to be bigger to ride.</span>")
|
||||
if(M in buckled_mobs)
|
||||
return FALSE
|
||||
if(M.size_multiplier > size_multiplier * 1.2)
|
||||
to_chat(M,"<span class='warning'>This isn't a pony show! You need to be bigger for them to ride.</span>")
|
||||
return FALSE
|
||||
if(M.loc != src.loc)
|
||||
if(M.Adjacent(src))
|
||||
M.forceMove(get_turf(src))
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(isTaurTail(H.tail_style))
|
||||
to_chat(H,"<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
|
||||
to_chat(src,"<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
|
||||
return FALSE
|
||||
|
||||
. = ..()
|
||||
if(.)
|
||||
buckled_mobs[M] = "riding"
|
||||
|
||||
/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user)
|
||||
if(can_buckle && istype(M))
|
||||
if(user_buckle_mob(M, user, silent = TRUE))
|
||||
visible_message("<span class='notice'>[M] starts riding [name]!</span>")
|
||||
return TRUE
|
||||
/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use.
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1))
|
||||
set name = "Taur Mount/Dismount"
|
||||
set category = "Abilities"
|
||||
set desc = "Let people ride on you."
|
||||
|
||||
if(LAZYLEN(buckled_mobs))
|
||||
var/datum/riding/R = riding_datum
|
||||
for(var/rider in buckled_mobs)
|
||||
R.force_dismount(rider)
|
||||
return
|
||||
if (stat != CONSCIOUS)
|
||||
return
|
||||
if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled)
|
||||
return
|
||||
if(buckle_mob(M))
|
||||
visible_message("<span class='notice'>[M] starts riding [name]!</span>")
|
||||
|
||||
/mob/living/carbon/human/attack_hand(mob/user as mob)
|
||||
if(LAZYLEN(buckled_mobs))
|
||||
|
||||
@@ -40,6 +40,10 @@ var/global/list/wing_icon_cache = list()
|
||||
qdel(overlay)
|
||||
|
||||
if(isTaurTail(tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/taurtype = tail_style
|
||||
if(taurtype.can_ride && !riding_datum)
|
||||
riding_datum = new /datum/riding/taur(src)
|
||||
verbs |= /mob/living/carbon/human/proc/taur_mount
|
||||
return image(tail_s, "pixel_x" = -16)
|
||||
else
|
||||
return image(tail_s)
|
||||
|
||||
6
html/changelogs/PrismaticGynoid-somemorepaifixes.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
author: PrismaticGynoid
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- tweak: "pAIs can now be picked up while unfolded, and can display more than 9 emotions."
|
||||
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 398 KiB After Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 64 KiB |
@@ -1208,6 +1208,7 @@
|
||||
#include "code\game\objects\structures\morgue_vr.dm"
|
||||
#include "code\game\objects\structures\musician.dm"
|
||||
#include "code\game\objects\structures\noticeboard.dm"
|
||||
#include "code\game\objects\structures\plasticflaps.dm"
|
||||
#include "code\game\objects\structures\railing.dm"
|
||||
#include "code\game\objects\structures\safe.dm"
|
||||
#include "code\game\objects\structures\signs.dm"
|
||||
|
||||