Files
CHOMPStation2/code/modules/overmap/champagne.dm
2022-10-02 17:59:49 +00:00

116 lines
5.4 KiB
Plaintext

//
// Champagne bottle for creating new landable ship shuttles in game from scratch.
// Note: It depends on the area being sane. In theory players could use this to make pretty much any room a shuttle.
//
/obj/item/champagne
name = "bottle of champagne"
desc = "Made from grapes grown in the champagne asteroid belt, the bubbly liquid inside is softly glowing. Suitable for christening boats, not so much for drinking."
description_info = "This lets you create a new overmap shuttle from scratch. \
The shuttle must already be constructed and have an area defined (use the blueprints). \
Only a single area is supported (for now). Build a shuttle console and hit it with the bottle."
icon = 'icons/obj/drinks.dmi'
icon_state = "champagne"
attack_verb = list("attacked", "bonked", "hit")
var/min_name_len = 4 // Refuse if shuttle tag is shorter than this.
var/max_name_len = 32 // Refuse if shuttle tag is longer than this.
var/max_area_turfs = 256 // Refuse if area has more than this many turfs.
/obj/item/champagne/afterattack(var/atom/A, mob/user as mob, proximity)
if(!proximity)
return
var/obj/machinery/computer/shuttle_control/explore/comp = A
if(!istype(comp))
return
if(comp.shuttle_tag)
to_chat(user, "<span class='warning'>[comp] is already configured to link with [comp.shuttle_tag]</span>")
return
user.visible_message("<span class='notice'>[user] lifts [src] bottle over [comp]!</span>")
var/shuttle_name = tgui_input_text(usr, "Choose a name for the shuttle", "New Shuttle Name")
if(!shuttle_name || QDELETED(src) || QDELETED(comp) || comp.shuttle_tag || user.incapacitated())
return // After input() safety re-checks
// Tons of safety checks here. Make sure they don't destroy everything.
if(length(shuttle_name) < min_name_len || length(shuttle_name) > max_name_len)
to_chat(user, "<span class='warning'>Name length must be between [min_name_len] and [max_name_len].</span>")
return
if(shuttle_name in SSshuttles.shuttles)
to_chat(user, "<span class='warning'>Invalid name: Already in use.</span>")
return
var/area/my_area = get_area(comp)
if(!my_area || istype(my_area, /area/space))
to_chat(user, "<span class='warning'>[comp] must be in a valid area to become a shuttle.</span>")
return
if(my_area in SSshuttles.shuttle_areas)
to_chat(user, "<span class='warning'>[comp] is already in a shuttle.</span>")
return
// Count turfs in the area
var/list/turfs = get_current_area_turfs(my_area)
if(turfs.len > max_area_turfs)
to_chat(user, "<span class='warning'>The new shuttle area is too large.</span>")
return
var/turf/comp_turf = get_turf(comp)
var/datum/shuttle/autodock/S = create_landable_shuttle(shuttle_name, comp_turf, my_area)
playsound(src, 'sound/effects/Glassbr3.ogg', 100, 0)
user.visible_message("<span class='notice'>[user] smashes [src] on [comp]</span>",
"<span class='info'>You smash [src] on [comp], christening a new landable ship named [S.name]</span>",
"<span class='notice'>You hear glass shattering</span>")
log_and_message_admins("[key_name_admin(user)] Created a new shuttle [S.name]. [ADMIN_JMP(comp_turf)]")
spawn(1 SECOND)
playsound(comp_turf, 'sound/voice/Serithi/Shuttlehere.ogg', 75, 0)
qdel(src)
return TRUE
/obj/item/champagne/proc/create_landable_shuttle(var/shuttle_name, var/turf/start_loc, var/area/shuttle_area)
// First things first, create the starting location landmark.
// WARNING - We can't figure out a good base_area or base_turf from inspecttion, as the shuttle is already built!
// For now its going to just do world.area and z level base turf. Beware!
var/area/base_area = world.area
var/base_turf = get_base_turf(get_z(start_loc))
var/obj/effect/shuttle_landmark/automatic/champagne/starting_landmark = new(start_loc, base_area, base_turf)
// Okay first things first create the shuttle Override to no areas to prevent runtimes, then add them in.
var/datum/shuttle/autodock/overmap/shuttle = new /datum/shuttle/autodock/overmap{shuttle_area = list()}(shuttle_name, starting_landmark)
LAZYADD(shuttle.shuttle_area, shuttle_area)
shuttle.refresh_fuel_ports_list() // We added area, refresh
shuttle.set_docking_codes(null) // It doesn't get to magically know docking codes.
// Unfortunately we can't simply call initialize_shuttle because it takes a typepath.
// I Don't want to rewrite that right now, so we must emulate. This is a special case anyway.
// Emulation of SSshuttles.initialize_shuttle(): All it does is add to shuttle areas and populate objects
SSshuttles.shuttle_areas |= shuttle.shuttle_area
shuttle.populate_shuttle_objects()
// Okay now create the SHIP part
var/obj/effect/overmap/visitable/ship/landable/champagne/newship = new(start_loc, shuttle_name, shuttle_name)
// It automatically registers itself with SSshuttles
log_debug("Created new ship [newship] for shuttle [shuttle] at landmark [starting_landmark]")
return shuttle
//
// Shuttle landmark dynamically generated at runtime by champagne bottle.
//
/obj/effect/shuttle_landmark/automatic/champagne
flags = SLANDMARK_FLAG_ZERO_G // Don't auto-set
/obj/effect/shuttle_landmark/automatic/champagne/Initialize(mapload, base_area, base_turf)
src.base_turf = base_turf
src.base_area = base_area
. = ..()
//
// Landable ship dynamically created at runtime by champagne bottle.
//
/obj/effect/overmap/visitable/ship/landable/champagne
desc = "Newly minted space faring vessel."
/obj/effect/overmap/visitable/ship/landable/champagne/Initialize(mapload, _name, _shuttle)
src.name = _name
src.shuttle = _shuttle
. = ..()