-
-
Notifications
You must be signed in to change notification settings - Fork 675
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
https://github.com/tgstation/tgstation/pull/65445
- Loading branch information
1 parent
354b0e7
commit 78531b8
Showing
10 changed files
with
406 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,196 @@ | ||
#define MODPAINT_MAX_COLOR_VALUE 1.25 | ||
#define MODPAINT_MIN_COLOR_VALUE 0 | ||
#define MODPAINT_MAX_SECTION_COLORS 2 | ||
#define MODPAINT_MIN_SECTION_COLORS 0.25 | ||
#define MODPAINT_MAX_OVERALL_COLORS 4 | ||
#define MODPAINT_MIN_OVERALL_COLORS 1.5 | ||
|
||
/obj/item/mod/paint | ||
name = "MOD paint kit" | ||
desc = "This kit will repaint your MODsuit to something unique." | ||
icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' | ||
icon_state = "paintkit" | ||
var/obj/item/mod/control/editing_mod | ||
var/atom/movable/screen/color_matrix_proxy_view/proxy_view | ||
var/list/current_color | ||
|
||
/obj/item/mod/paint/Initialize(mapload) | ||
. = ..() | ||
current_color = color_matrix_identity() | ||
|
||
/obj/item/mod/paint/examine(mob/user) | ||
. = ..() | ||
. += "span class='notice'<b>Left-click</b> a MODsuit to change skin.</span>" | ||
. += "span class='notice'<b>Right-click</b> a MODsuit to recolor.</span>" | ||
|
||
/obj/item/mod/paint/pre_attack(atom/attacked_atom, mob/living/user, params) | ||
if(!istype(attacked_atom, /obj/item/mod/control)) | ||
return ..() | ||
var/obj/item/mod/control/mod = attacked_atom | ||
if(mod.active || mod.activating) | ||
balloon_alert(user, "suit is active!") | ||
return TRUE | ||
paint_skin(mod, user) | ||
|
||
/* Not usable until combat mode or alternative fire | ||
/obj/item/mod/paint/pre_attack_secondary(atom/attacked_atom, mob/living/user, params) | ||
if(!istype(attacked_atom, /obj/item/mod/control)) | ||
return ..() | ||
var/obj/item/mod/control/mod = attacked_atom | ||
if(mod.active || mod.activating) | ||
balloon_alert(user, "suit is active!") | ||
return TRUE | ||
if(editing_mod) | ||
return TRUE | ||
editing_mod = mod | ||
proxy_view = new() | ||
proxy_view.appearance = editing_mod.appearance | ||
proxy_view.color = null | ||
proxy_view.register_to_client(user.client) | ||
ui_interact(user) | ||
return TRUE | ||
*/ | ||
|
||
/obj/item/mod/paint/ui_interact(mob/user, datum/tgui/ui) | ||
if(!editing_mod) | ||
return | ||
ui = SStgui.try_update_ui(user, src, ui) | ||
if(!ui) | ||
ui = new(user, src, "MODpaint", name) | ||
ui.open() | ||
|
||
/obj/item/mod/paint/ui_host() | ||
return editing_mod | ||
|
||
/obj/item/mod/paint/ui_close(mob/user) | ||
. = ..() | ||
editing_mod = null | ||
QDEL_NULL(proxy_view) | ||
current_color = color_matrix_identity() | ||
|
||
/obj/item/mod/paint/ui_status(mob/user) | ||
if(check_menu(editing_mod, user)) | ||
return ..() | ||
return UI_CLOSE | ||
|
||
/obj/item/mod/paint/ui_static_data(mob/user) | ||
var/list/data = list() | ||
data["mapRef"] = proxy_view.assigned_map | ||
return data | ||
|
||
/obj/item/mod/paint/ui_data(mob/user) | ||
var/list/data = list() | ||
data["currentColor"] = current_color | ||
return data | ||
|
||
/obj/item/mod/paint/ui_act(action, list/params) | ||
. = ..() | ||
if(.) | ||
return | ||
switch(action) | ||
if("transition_color") | ||
current_color = params["color"] | ||
animate(proxy_view, time = 0.5 SECONDS, color = current_color) | ||
if("confirm") | ||
if(length(current_color) != 20) //20 is the length of a matrix identity list | ||
return | ||
for(var/color_value in current_color) | ||
if(isnum(color_value)) | ||
continue | ||
return | ||
var/total_color_value = 0 | ||
var/list/total_colors = current_color.Copy() | ||
total_colors.Cut(13, length(total_colors)) // 13 to 20 are just a and c, dont want to count them | ||
var/red_value = current_color[1] + current_color[5] + current_color[9] //rr + gr + br | ||
var/green_value = current_color[2] + current_color[6] + current_color[10] //rg + gg + bg | ||
var/blue_value = current_color[3] + current_color[7] + current_color[11] //rb + gb + bb | ||
if(red_value > MODPAINT_MAX_SECTION_COLORS) | ||
balloon_alert(usr, "total red too high! ([red_value*100]%/[MODPAINT_MAX_SECTION_COLORS*100]%)") | ||
return | ||
else if(red_value < MODPAINT_MIN_SECTION_COLORS) | ||
balloon_alert(usr, "total red too low! ([red_value*100]%/[MODPAINT_MIN_SECTION_COLORS*100]%)") | ||
return | ||
if(green_value > MODPAINT_MAX_SECTION_COLORS) | ||
balloon_alert(usr, "total green too high! ([green_value*100]%/[MODPAINT_MAX_SECTION_COLORS*100]%)") | ||
return | ||
else if(green_value < MODPAINT_MIN_SECTION_COLORS) | ||
balloon_alert(usr, "total green too low! ([green_value*100]%/[MODPAINT_MIN_SECTION_COLORS*100]%)") | ||
return | ||
if(blue_value > MODPAINT_MAX_SECTION_COLORS) | ||
balloon_alert(usr, "total blue too high! ([blue_value*100]%/[MODPAINT_MAX_SECTION_COLORS*100]%)") | ||
return | ||
else if(blue_value < MODPAINT_MIN_SECTION_COLORS) | ||
balloon_alert(usr, "total blue too low! ([blue_value*100]%/[MODPAINT_MIN_SECTION_COLORS*100]%)") | ||
return | ||
for(var/color_value in total_colors) | ||
total_color_value += color_value | ||
if(color_value > MODPAINT_MAX_COLOR_VALUE) | ||
balloon_alert(usr, "one of colors too high! ([color_value*100]%/[MODPAINT_MAX_COLOR_VALUE*100]%") | ||
return | ||
else if(color_value < MODPAINT_MIN_COLOR_VALUE) | ||
balloon_alert(usr, "one of colors too low! ([color_value*100]%/[MODPAINT_MIN_COLOR_VALUE*100]%") | ||
return | ||
if(total_color_value > MODPAINT_MAX_OVERALL_COLORS) | ||
balloon_alert(usr, "total colors too high! ([total_color_value*100]%/[MODPAINT_MAX_OVERALL_COLORS*100]%)") | ||
return | ||
else if(total_color_value < MODPAINT_MIN_OVERALL_COLORS) | ||
balloon_alert(usr, "total colors too low! ([total_color_value*100]%/[MODPAINT_MIN_OVERALL_COLORS*100]%)") | ||
return | ||
editing_mod.set_mod_color(current_color) | ||
SStgui.close_uis(src) | ||
|
||
/obj/item/mod/paint/proc/paint_skin(obj/item/mod/control/mod, mob/user) | ||
if(length(mod.theme.skins) <= 1) | ||
balloon_alert(user, "no alternate skins!") | ||
return | ||
var/list/skins = list() | ||
for(var/mod_skin in mod.theme.skins) | ||
skins[mod_skin] = image(icon = mod.icon, icon_state = "[mod_skin]-control") | ||
var/pick = show_radial_menu(user, mod, skins, custom_check = CALLBACK(src, .proc/check_menu, mod, user), require_near = TRUE) | ||
if(!pick) | ||
balloon_alert(user, "no skin picked!") | ||
return | ||
mod.set_mod_skin(pick) | ||
|
||
/obj/item/mod/paint/proc/check_menu(obj/item/mod/control/mod, mob/user) | ||
if(user.incapacitated() || !user.is_holding(src) || !mod || mod.active || mod.activating) | ||
return FALSE | ||
return TRUE | ||
|
||
#undef MODPAINT_MAX_COLOR_VALUE | ||
#undef MODPAINT_MIN_COLOR_VALUE | ||
#undef MODPAINT_MAX_SECTION_COLORS | ||
#undef MODPAINT_MIN_SECTION_COLORS | ||
#undef MODPAINT_MAX_OVERALL_COLORS | ||
#undef MODPAINT_MIN_OVERALL_COLORS | ||
|
||
/obj/item/mod/skin_applier | ||
name = "MOD skin applier" | ||
desc = "This one-use skin applier will add a skin to MODsuits of a specific type." | ||
icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' | ||
icon_state = "skinapplier" | ||
var/skin = "civilian" | ||
var/compatible_theme = /datum/mod_theme | ||
|
||
/obj/item/mod/skin_applier/Initialize(mapload) | ||
. = ..() | ||
name = "MOD [skin] skin applier" | ||
|
||
/obj/item/mod/skin_applier/pre_attack(atom/attacked_atom, mob/living/user, params) | ||
if(!istype(attacked_atom, /obj/item/mod/control)) | ||
return ..() | ||
var/obj/item/mod/control/mod = attacked_atom | ||
if(mod.active || mod.activating) | ||
balloon_alert(user, "suit is active!") | ||
return TRUE | ||
if(!istype(mod.theme, compatible_theme)) | ||
balloon_alert(user, "incompatible theme!") | ||
return TRUE | ||
mod.set_mod_skin(skin) | ||
balloon_alert(user, "skin applied") | ||
qdel(src) | ||
return TRUE | ||
|
||
/obj/item/mod/skin_applier/honkerative | ||
skin = "honkerative" | ||
compatible_theme = /datum/mod_theme/syndicate |
Oops, something went wrong.