-- object_furniture - Attach to smart objects to extend them to be rotate-able isometric furniture (chairs, rocks, etc). -- Supports multiple sprites for multiple viewing angles and allows the user the rotate the object right and left. -- Created by: Thor Alexander -- Created on: 5/28/2008 -- Modified on: 5/28/2008 (TA) - Based on object_furniture_anim_strips. -- 6/16/2008 (TA) - Moved sprite_map table into def props section. -- Listens for these triggers: -- configure(user_object) - brings up configure window to select furnitures rotation angle. -- use(user_object) - nothing -- rotate_right(user_object) - rotate the furniture right one frame. -- rotate_left(user_object) - rotate the furniture left one frame. -- confirm_config(user_object) - accept and set the current config settings. -- Broadcasts these triggers: -- none -- Constants -- Script Properties Define Properties() --- Private Properties ui_smart_object_portrait_index = 1 PersistProperty('ui_smart_object_portrait_index') sprite_map = {} smart_object_sprite_id_1 = '12071:53' ExposeProperty('smart_object_sprite_id_1', 'Select the Forward Right facing sprite for this furnishing', 'spriteId') PersistProperty('smart_object_sprite_id_1') smart_object_sprite_id_2 = '12071:55' ExposeProperty('smart_object_sprite_id_2', 'Select the Forward Left facing sprite for this furnishing', 'spriteId') PersistProperty('smart_object_sprite_id_2') smart_object_sprite_id_3 = '12071:54' ExposeProperty('smart_object_sprite_id_3', 'Select the Rear Left facing sprite for this furnishing', 'spriteId') PersistProperty('smart_object_sprite_id_3') smart_object_sprite_id_4 = '12071:56' ExposeProperty('smart_object_sprite_id_4', 'Select the Rear Right facing sprite for this furnishing', 'spriteId') PersistProperty('smart_object_sprite_id_4') smart_object_sprite_width = 128 ExposeProperty('smart_object_sprite_width', 'What is the width of the sprites?') PersistProperty('smart_object_sprite_width') smart_object_sprite_height = 128 ExposeProperty('smart_object_sprite_height', 'What is the height of the sprites?') PersistProperty('smart_object_sprite_height') IncludeScript('13197:21') -- ui_library script_description = 'Furniture' script_long_description = 'Allows an object to be rotated between four different views' script_icon = '12071:433' end -- Commands -- Triggers Trigger attach() table.insert(self.sprite_map, self.smart_object_sprite_id_1) table.insert(self.sprite_map, self.smart_object_sprite_id_2) table.insert(self.sprite_map, self.smart_object_sprite_id_3) table.insert(self.sprite_map, self.smart_object_sprite_id_4) SendTo(self, 'radial_menu_register', 0, self, 'Rotate Right', string.format('/event radial_rotate_furniture_right %d', self.id), ui_library.rotate_counterclockwise.normal, ui_library.rotate_counterclockwise.hover, ui_library.rotate_counterclockwise.press, 300) SendTo(self, 'radial_menu_register', 0, self, 'Rotate Left', string.format('/event radial_rotate_furniture_left %d', self.id), ui_library.rotate_clockwise.normal, ui_library.rotate_clockwise.hover, ui_library.rotate_clockwise.press, 200) local scale_x = self.spriteScaleX local scale_y = self.spriteScaleY self.spriteId = self.sprite_map[self.ui_smart_object_portrait_index] self.spriteScaleX = scale_x self.spriteScaleY = scale_y end Trigger detach() self.spriteId = stylesheet.templates[self.templateId].spriteId SendTo(self, 'radial_menu_unregister', 0, self, 'Rotate Right') SendTo(self, 'radial_menu_unregister', 0, self, 'Rotate Left') end Trigger radial_menu_registration() SendTo(self, 'radial_menu_register', 0, self, 'Rotate Right', string.format('/event radial_rotate_furniture_right %d', self.id), ui_library.rotate_counterclockwise.normal, ui_library.rotate_counterclockwise.hover, ui_library.rotate_counterclockwise.press, 101) SendTo(self, 'radial_menu_register', 0, self, 'Rotate Left', string.format('/event radial_rotate_furniture_left %d', self.id), ui_library.rotate_clockwise.normal, ui_library.rotate_clockwise.hover, ui_library.rotate_clockwise.press, 100) end Trigger radial_menu_unregistration() SendTo(self, 'radial_menu_unregister', 0, self, 'Rotate Right') SendTo(self, 'radial_menu_unregister', 0, self, 'Rotate Left') end Trigger set_script_param(caller, user_id, script_id, param, value) if(script_id == '12071:8') then if(param == 'smart_object_sprite_id_1') then index = 1 end if(param == 'smart_object_sprite_id_2') then index = 2 end if(param == 'smart_object_sprite_id_3') then index = 3 end if(param == 'smart_object_sprite_id_4') then index = 4 end if(index > 0) then self['smart_object_sprite_id_' .. index] = value self.sprite_map[index] = value if(index == self.ui_smart_object_portrait_index) then self.spriteId = self.sprite_map[self.ui_smart_object_portrait_index] end end end end Trigger custom_config_bak(called, user_id, script_id) SendTo(self, 'draw_config_window', 0, self, user_id, 300, 400, 'Furniture', script_id) local user = GetObjectById(user_id) local thumbnail = UiWindow(user.smart_object_window, 'thumbnail_view', 50, 70, 100, 100, '12071:2') local icon_sprite = stylesheet.sprites[self.spriteId] local sprite_scale_x = 1 local sprite_scale_y = 1 if(self.spriteScaleX > self.spriteScaleY) then sprite_scale_y = self.spriteScaleY / self.spriteScaleX end if(self.spriteScaleY > self.spriteScaleX) then sprite_scale_x = self.spriteScaleX / self.spriteScaleY end local icon_w = 85 * sprite_scale_x local icon_h = 85 * sprite_scale_y local icon = UiImage(thumbnail, 'thumbnail_icon', 50 - icon_w/2, 50 - icon_h/2, icon_w, icon_h, self.spriteId) local rotate_right = UiImageButton(thumbnail, 'rotate_right', 68, 96, 32, 32, rotate_right.normal, rotate_right.hover, rotate_right.press, string.format('/event rotate_furniture_right %d %d %s', self.id, user.id, script_id)) local rotate_left = UiImageButton(thumbnail, 'rotate_left', 0, 96, 32, 32, rotate_left.normal, rotate_left.hover, rotate_left.press, string.format('/event rotate_furniture_left %d %d %s', self.id, user.id, script_id)) end Trigger rotate_furniture_right(caller, user_id, script_id) Debug("Rotate Right") local user = GetObjectById(user_id) rotate_right(self) SendTo(self, 'custom_config', 0, user, script_id) end Trigger rotate_furniture_left(caller, user_id, script_id) Debug("Rotate Left") local user = GetObjectById(user_id) rotate_left(self) SendTo(self, 'custom_config', 0, user, script_id) end Trigger radial_rotate_furniture_left(caller) rotate_left(self) end Trigger radial_rotate_furniture_right(caller) rotate_right(self) end Trigger radial_furniture_custom_config(caller, user_id) local user = GetObjectById(user_id) if(user == nil) then return end -- Draw Window local window_w = 300 local window_h = 300 local main_size = 100 local angle_size = 64 local custom_window = ui_default_window(0, 'custom_furniture_window', 0, 0, window_w, window_h) local window_title = UiMultiLabel(custom_window, 'custom_furniture_window_title', 0, 0, 200, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) UiText(window_title, 'Customize Furniture') -- Draw Main Furniture Icon local main_x = window_w/2 - main_size/2 local main_y = window_h/2 - main_size/2 local main_w = self.spriteScaleX * main_size local main_h = self.spriteScaleY * main_size local main_icon_x = main_size/2 - main_w/2 local main_icon_y = main_size/2 - main_h/2 local main_image = UiElement(custom_window, 'main_image_element', main_x, main_y) image_box(main_image, main_size) local main_image_icon = image_icon(main_image, self.spriteId, main_size, 2) local angle_1_image = UiElement(custom_window, 'angle_1_image', 12, 30) image_box(angle_1_image, angle_size) local angle_1_icon = image_icon(angle_1_image, self.sprite_map[1], angle_size, 2) local angle_2_image = UiElement(custom_window, 'angle_2_image', window_w - angle_size - 12, 30) image_box(angle_2_image, angle_size) local angle_2_icon = image_icon(angle_2_image, self.sprite_map[2], angle_size, 2) local angle_3_image = UiElement(custom_window, 'angle_3_image', window_w - angle_size - 12, window_h - angle_size - 12) image_box(angle_3_image, angle_size) local angle_3_icon = image_icon(angle_3_image, self.sprite_map[3], angle_size, 2) local angle_4_image = UiElement(custom_window, 'angle_4_image', 12, window_h - angle_size - 12) image_box(angle_4_image, angle_size) local angle_4_icon = image_icon(angle_4_image, self.sprite_map[4], angle_size, 2) UiAlign(custom_window, 0, 0, 'center', 'scale_none') UiAttachUser(user, custom_window) end -- Local Functions - function image_box(ui_element, size) local bg_1 = UiRect(ui_element, 'bg_1', 0, 0, size, size) UiColor(bg_1, 0, 0, 0, 1) local bg_2 = UiRect(ui_element, 'bg_2', 1, 1, size - 2, size - 2) end function image_icon(ui_element, icon, parent_size, border) local scale_x = stylesheet.sprites[icon].scaleX local scale_y = stylesheet.sprites[icon].scaleY local scale_x_icon = 1 local scale_x_icon = 1 Debug("%s %s", scale_x, scale_y) if(scale_x > scale_y) then local coeff = scale_y/scale_x Debug(coeff) scale_x_icon = 1 scale_y_icon = coeff end if(scale_x < scale_y) then local coeff = scale_y/scale_x scale_y_icon = 1 scale_x_icon = coeff end Debug("%s %s", scale_x_icon, scale_y_icon) local size_x = scale_x_icon * (parent_size - border) local size_y = scale_y_icon * (parent_size - border) local x = parent_size/2 - size_x/2 local y = parent_size/2 - size_y/2 local icon = UiImage(ui_element, 'icon', x, y, size_x, size_y, icon) end function rotate_right(self) local scale_x = self.spriteScaleX local scale_y = self.spriteScaleY self.ui_smart_object_portrait_index = self.ui_smart_object_portrait_index - 1 if(self.ui_smart_object_portrait_index < 1) then self.ui_smart_object_portrait_index = 4 end self.spriteId = self.sprite_map[self.ui_smart_object_portrait_index] self.spriteScaleX = scale_x self.spriteScaleY = scale_y end function rotate_left(self) local scale_x = self.spriteScaleX local scale_y = self.spriteScaleY self.ui_smart_object_portrait_index = self.ui_smart_object_portrait_index + 1 if(self.ui_smart_object_portrait_index > 4) then self.ui_smart_object_portrait_index = 1 end self.spriteId = self.sprite_map[self.ui_smart_object_portrait_index] self.spriteScaleX = scale_x self.spriteScaleY = scale_y end