This is located in a file named “moD_update_jan-apr99.txt” and is referenced to by another text file named mod_update.txt, which simply states<\/strong>:<\/p>\n\n\n\n2:34 PM 9\/18\/2000\n- Old mod_update.txt moved to mod_update_jan-apr99.txt<\/pre>\n\n\n\n… and luckily, they also leftover “moD_update_99.txt”!!<\/p>\n\n\n\n
Click the text below to view the text file (very large!)<\/strong><\/p>\n\n\n\nmoD_update_99.txt<\/summary>\n\n\ndec 24\n---\n\n\nnew psc op:\n\n print_active\n\n prints a list of sleeping and non sleeping objects\n\n---\n\nIn the test level, the following is a typical active list: (no weapons going off)\n\nnotes:\n \n can objects with * have can_rest set?\n there are a lot of dustpuffs, is this many necessary?\n\n\n*rh_100_ton_weight_large\n*rh_bridge\n* rh_target1\n* rh_target1\n* rh_cactus_collapsed\n* rh_cactus_collapsed\n* rh_cactus_collapsed\n* rh_cactus_collapsed\n* rh_cactus_collapsed\n> rh_oil_pump\n> rh_DES_MRPE_LOD0\n* rh_cactus_collapsed\n* rh_target1\n* rh_DES_SKA_LOD0\n* rh_DES_SKB_LOD0\n* rh_DES_SKC_LOD0\n* rh_DES_SKD_LOD0\n> el_Max_jalopy_bits1\n> el_Max_jalopy_bits1\n> el_Max_jalopy_bits1\n> el_Max_jalopy_bits1\n> dp_tornado3\n> el_Max_jalopy_bits1\n> SR_DustPuff7\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff4\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff4\n> SR_DustPuff5\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff4\n> SR_DustPuff5\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff4\n> SR_DustPuff5\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff4\n> SR_DustPuff5\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n> SR_DustPuff1\n> SR_DustPuff3\n> SR_DustPuff2\n> SR_DustPuff4\n> SR_DustPuff5\n> SR_DustPuff6\n> SR_DustPuff7\n> SR_DustPuff8\n\n---\n\nprofile info for mod events is now part of gameos profile data\n\n\n\n\n\n---\n\n\ndec 22\n---\n\nfixed: when set_control_mode() was called with high priority, the car would never recover\n\n\n---\n\nsmoosh_handler::apply_flatten works\n\n---\n\nsmoosh_handler::apply_dent works\n\n\n---\n\nfixed: \"too many stars and birds\" \n\n---\n\n\nmisc psc ops for stunned camera:\n\n float,cam_stunned_max_dist,(16.0f),\n \"when stunned, the camera will ensure that it is at most this distance from the player\" );\n\n float,cam_stunned_min_dist, (6.0f),0);\n\t \"when stunned, the camera will ensure that it is at least this distance from the player\" );\n\n float,cam_stunned_min_height,(6.0f),0);\n\t \"when stunned, the camera will ensure that it is at least this hight above the player\" );\n\n\n\n---\n\n\nfix: ffd 0z, 0y, 1z, 1y did not work\n\n\nfix: ffds with extent offsets were not supported, now they are\n\t to deform the legs of the figure while maintaining connection to the chest, \n\t position the ffd box s.t. the top ffd points are on the connection plane \n\t and ensure that they are fixed\n\n---\n\n bridge turner now disables driving and ffds\n\n (rich)\n---\n \nstars and birds work again\n\n---\n\n holding shown shift while using the dof->select_* functions will apend selected but not unselect other ffd points\n\n (rich)\n \n\n---\n\nfix: \n bridge turner updated to use actuate_Vd()\n\n---\n\nnew for key frame:\n\n clear()\n\n - clears current transform\n\n\n\n---\n\nfix:\n\n start sim\/end sim with a mounted pack open would hide the mounted pack\n\n (e.g. max would disappear in editor after end sim )\n\n---\n\nfix: \n max's mount type was weapon\n he was droped when the user picked up other weapons\n\n---\n\nedm spawn has a new member:\n\n orient_mode:\n \n orient with source\n\torient with world\n\torient with velocity\n\n\ne.g. the birds and stars are passed a link orientation (collision normal) when they are spawned. \n this enables them to always stay upright\n\n\ndw_smoosh_handler.dwp has been updated to use this setting for the stars and birds\n\n \n---\n\n\nnew flag for ed_dof: \n \n draw_ffd\n\n\n the dof's ffd will be drawn if it is active.\n\n previously they would only draw their ffd if they were selected and the ffd was active.\n\n\ndec 21\n---\n\n\nnew psc op:\n\n reset_camera\n\nthis will restore the camera from a go_to() that was never terminated with\nrestore_normal_control()\n\nthis should not be necessary, but might come in handy to cover up a cam control bug\n\n---\n\n\n rt_camera::set_stunned()\n and\n rt_camera::go_to() \n \n fixed\n\n\n---\n\n\nyou can now edit ffds of mounted packs\n\n(rich)\n\n---\n\n\nffd points can have damping and ineritia:\n\n each point has a setting\n the setting has 3 scales, (x,y,z) for a uniform force, make this equal.\n (in some cases you may want to constrain points, e.g headlight having damping only in z)\n\n to set persistant damping effects: \n -add_key on dof\n\t-click on the dof->ffd_point menu (or right click on the ffd points on screen, they should have mouse overs and dialogs)\n\t-set the appropriate values\n -set the key to have travel time of 0.5 (lower for higher frequency, or higher for lower frequency)\n\t-set hold to 999999\t (hold forever\n\t-set the sub target to none\n\t-set the l0 active flag to true\n\n\nexample:\n\n dw_max_jalopy1:\n \n max's head has inertia effects. when you bake it tilts forward, etc.\n \n canopy has damping effects, this similates drag like a parachute\n \n\n\n---\n\n\n\n I mounted a test max in his car\n\n - added a mount to the car at the position of the rtf_car_funtional\n - added the max pack to this mount\n - changed his root to fixed\n - set no mass for all frames\n - set inherits warp for root\n - removed rtf_figure functional\n\n---\n\n\n\ndof_03 saves its orientation\n\n\n---\n\n\nshow dofs() dialog now includes ffd info\n\n\n---\n\nl1_frame::b_inherits_warp has been replaced with:\n\n l1_frame::m_warp_inherit with the following options:\n \n none\n full \n position offset only\n\n if the flag was previously set, this will be \"full\", otherwise it will be none.\n\n\n position offset shifts the frame s.t. the dof origin remains fixed in the parents cordinates\n rotation, scale and bend are not applied.\n\n \n e.g. if you set this for the players shoulder, it will not strech and bend with the parent, however it\n will stay attached, and you can set it's ffd worrying about cancelling out the effects of the parent\n\n\n---\n\nfix: stun birds orbit about car origin\n\n\n---\n\nwhen a pack is destroyed, its driver, if any, is also destroyed.\n\nwhen it is respawned, the driver will also be respawned.\n\n\n---\n\n collision detection:\n\n - all spline driving surfaces should be planes (4 points)\n \n in general, this is the best cld rep to use:\n \n\n - 1 hull\n\t- call make_rect()\n\t- set \"scale\" to 32, 16, 1\n\t- set extrude r to 0.75\n\t- set c to 0 0 -0.75\n\t- set \"flat\" to true\n\t- max z for mesh verts should be 0.0\n\n\ttest cases: \n\t- rh_canyon_jump\n\t- rh_road_pavement\n\n\n use \"draw_wheel_contacts 1\"\t (psc op) to view the surface normals\n of what you are driving on. Use this to test the level\n\n---\n\n wheel collision rep:\n \n - the distance from the bottom of the wheel spheres to the bottom of the mesh should be 0.5 meters\n - max_jalopy wheel centers need to be changed from z = -0.25 to z = -0.40\n\n\t- for consistant driving, the wheel radius - wheel_z should be 1.15 (the same disance of the test cars)\n\t other values should work, but having the cofm shifting may have side effects.\n\n\t- exported dw_max_jalopy1.dwb\n---\n\n\n\npsc op reeneabled:\n profile 1\n\nthis will give you a profile of where time in physics is being spent\n\n(gos reports this as game logic)\n\nnote: the gos readout \"game logic\" also includes loading textures and file access.\n\n\n\n---\n\n transform dialog update:\n\n you can now specify a transform origin \n rotation and scaling will take place about this point\n\t \n order of operations is: \n \n rotate, scale, translate\n\twas:\n\t scale, rotate, translate\n\n tip: select ffds points\n use vec stack->average_selected()\n\t\t load_to_stack on transform origin\n\t\t now rotation and scaling will not shift your ffd \n\n\n\t\n\ndec 20\n---\n\n fix: key frames with high frequency would not reach their targets.\n this was due to numerical integration inaccuracy for very key ks,kd\n (frequency of 16 and damping of 1 would only reach about 50% of its intended displacement)\n\n this is why for example flatten would not completely flatten meshes in recent builds\n\n---\nadded sub_target_ids:\n\n \"motion_flatten_from_top\",\n \"motion_flatten_from_side\",\n \"motion_flatten_from_front\",\n\n(daniel)\n---\n\nnew for batch:\n \n show_key_frames()\n\n shows all key frames in the active motion in all packs within batch\n\n note: this dialog will not maintain its sort order (e.g. if you change the duration of a key, close the \n dialog and reopen for it to resort)\n\n\n\n---\n\n\n bug fix: only four bits were allocated for sub target, new sub_targets (motion_1 .. etc) were above this number\n and they would wrap\n\n---\n\n\n\n All articulated motion for dw_figure_1 has been removed.\n \n The only force that is applied is a 6 dof potential to keep the character in place.\n\n\n---\n\n\n new psc op: player_motion \"motion_accelerate\"\n\n player_motion \"motion_brake\"\n\n .. etc any sub target_id will work\n\nfor fast testing you could add the following to your psc:\n\n bind 4 player_motion \"motion_accelerate\"\n bind 5 player_motion \"motion_brake\"\n\n\n\n---\n\nb_disable_draw and b_disable_collisions are automatically copied from \na root car to the driver. (this may be changed in the future, but accomodates the mole)\n\n---\nnew for pack:\n\n \/\/ if this is a car and it has a figure driving it, \n \/\/ the figure is returned;\n __inertia_export rt_pack * get_driver() const;\n\n\n---\n\n\n frame_warper::get( f )\n\nhas been replaced with:\n\n f->get_warper() \n\n f->get_warper_always() will bypass the can_warp flag\n \n\n f->get_warper_if_exists() will query for a warper, if none exists it returns null\n \t\t\t\t\t\t the default bevahiour is to create one if can_warp is set and return this\n\n\n---\n\n warpers now have an actuate_priority similar to dofs.\n\n set_pdk() requires an actuate priority.\n\n before applying a deform you can use test_actuate(), or actuate() to check to see if you \n have priviledge to actuate the warper.\n \n \/\/ this will apply a non-exclusive actuate\n \/\/ it will not prevent subsequent calls\n\n if( warp->test_actuate(frame::ap_default) )\n warp->apply_deform();\n\n\n \/\/ this will apply an exclusive actuate\n \/\/ it will prevent subsequent calls if the specified priority is higher\n \/\/ than that of subsequant calls\n\n if( warp->actuate(frame::ap_default) )\n warp->apply_deform();\n\n\n---\n\n\nbatches now display a list of active key frames\nyou can shift click on the member \"active_key_frames\" to keep the list open while you edit\n\n\n(rich)\n---\nrich click precision fixed\n\n(rich)\n---\n\nnew for dof: auto shear\n\nrotates ends of a 1 strip ffd to make them perpendicular to the spine\n\n---\n\n\n\ndec 19\n---\nnew for mesh_view->options:\n\n bool draw_ffds\n draws all active ffds\n\n---\n\n\n\n\ndec 17\n---\n\nbug fix:\n\n mouse over the screen when editing text would often erase what you were typing\n(gary)\n---\n\n\n\ndec 16\n---\n\nnew for ef_rod:\n\nbool 1,7,b_no_force_on_other)\n If set, the object that I am attached to is not forced\n using for following objects\n\nbool 1,8,b_no_force_on_owner)\n If set, the object that I am in to is not forced\n using for attracting objects\n\nbool 1,9,b_attach_on_spawn)\n if set, I attach to the link object when I am spawned\n\nbool 1,10,b_draw_line)\n if set, line is drawn\n\n---\n\nstun effect updated (smoosh handler)\n\nsonya and sasha rule!\n\n\n---\n\nfpu math exceptions can now be ignored \nnote: if you click yes on the message box, all fpu exceptions will be ignored until you restart.\n\n---\n\nnew psc op: \n\ndraw_ffds 1\n\n( forgot to mention it before :o )\n\n---\n\nbug fix: sub_target_ids for funcs were clamped to weapon_max\n \n---\n\nbug fix: key_frame save_load was not compiled, object class would not save\n y1,z1 members\n\n(daniel)\n---\n\nnew psc op: disable_sleeping\t1\n\nfor debugging only\nsleeping objects may have bugs. e.g. they may not dispatch messages when they should, update their ffds, etc.\n\nif this fixes an object that doesn't do what it should, please let me know.\n\n\n---\n\nbug fix: static and sleeping objects would not properly update their cvs\n\n\n---\n\n\n\n\n\ndec 15\n---\n\nffd shear is now an l1 member of l1_ed_dof\n\n\n---\n\nmouse overs fixed\n\n---\n\npack_warper.h renamed frame_warper.h\n\n---\nrtf_cars now have a \"control mode\"\n\n\nThis is used to actuate a vehicle and disable specific driving functionality.\n\n\nexample flip corrector:\n \/\/\n \/\/ set acceleration\n \/\/\n f->actuate_Vd( acc, f->ap_manuever_1, false);\n \n rtf_car * car = car->get(f->get_pack());\n if( car )\n {\n rtf_car::control_mode cm(2.f); \/\/ disable for at most 2 seconds\n \n\t \/\/ disable all driving behaviour\n\t cm.disable_driving= true;\n cm.disable_flight_stabilizer =true;\n\n cm.end_on_contact = true;\t\t \/\/ restore control it I touch the ground\n car->set_control_mode( cm );\n }\n \n\n\n\n\nrtf_car.h\n\n\n \/\/ \n \/\/ control mode\n \/\/\n enum control_mode_priority\n {\n cm_pri_none, \/\/ no explicit controller\n \n cm_pri_low,\n \n cm_pri_default,\n \n cm_pri_high,\n \n };\n\n\n struct control_mode\n {\n float speed_scale; \/\/ default 1.0, 0.5 limits the car to half of its max speed\/acceleration\n \n u8 priority;\n u8 steps_left; \/\/ see reset(duration)\n u8 steps_active; \/\/ \/\/ internal use\n \n \n bool disable_ffd : 1; \/\/ if set, I do not modify the ffd\n bool disable_driving: 1; \/\/ prevents any driving related behaviour\n bool disable_flight_stabilizer: 1; \/\/ when not in contact, prevents the car from trying to correct itself\n\n \n bool spinout: 1; \/\/ causes car to spinout\n\t\t\t\t\t\t\t\t\t\t \/\/ not yet implemented\n bool end_on_contact: 1; \/\/ if this is true, the control mode will end and restore normal control\n \/\/ as soon as the car is in contact with the world\n\n\n \n \n __inertia_export void reset(\n float duration, \/\/ determines when this control mode ends. After this time, \n \/\/ control mode is set to default\n \/\/ note: see \"end_on_contact\"\n control_mode_priority priority ); \n \n inline control_mode(float duration, control_mode_priority _priority = cm_pri_default )\n {\n reset(duration, _priority );\n }\n \n inline void disable_all()\n {\n disable_ffd =true;\n disable_driving =true; \n disable_flight_stabilizer =true;\n }\n };\n\n\n \n control_mode m_control_mode;\n \n \/\/ returns true if successful, false otherwise\n virtual bool set_control_mode( const control_mode & mode );\n\n inline void set_default_control_mode() { set_control_mode(control_mode(0, cm_pri_default)); }\n\n\n---\n\n\ndec 14\n---\n\nshadows and silos draw again.\n\n\n---\n\n\nbug fix: ffd's that are created, but never touched would crash (e.g. cactus)\n \n\n---\n\ncld hulls and other prims will be transformed by road warping\n\nif you pretesstate with hulls, there should be no gaps.\n\ne.g.\n\n ---- ----- ---- ----- \n| || || || |\n ---- ----- ---- -----\n\n---\n\n\nyou can now call right_click->more() on any 3d vector\n\n- this will create a dialong for the vector\twith 3 sliders and buttons\n- the grid settings in editor_config control the granularty\n\n---\n\nYou can test FFDs on dofs through the property window of the dof (non shared)\nset the dof type to 1x,1y or 1z (1x is main axis for cars)\n\n0,8,m_ffd_mode,ffd_mode_toggles)\n\/\/? Sets the ffd more fo the dof\n\/\/? for testing only\n\nfloat,ffd_shear)\n\/\/? ffd shear\n\/\/? controls how much auto shear is applied to the FFd in 1d modes.\n\/\/? 1 causes the ffd to rotate, 0 causes a pure shear\n\n10,vec3f,ffd_c[0], \"c0\" )\n\/\/? o o ^\n\/\/? | | Z\n\/\/? --o-o-O <X\n\n11,vec3f,ffd_c[1], \"c1\" )\n\/\/? o o ^\n\/\/? | | Z\n\/\/? --o-O-o <X\n\n12,vec3f,ffd_c[2], \"c2\" )\n\/\/? o o ^\n\/\/? | | Z\n\/\/? --O-o-o <X\n\n\n13,vec3f,ffd_c[3], \"y0\" )\n\/\/? --o-o-o < X\n\/\/? | | Y\n\/\/? o O \\\/\n\n14,vec3f,ffd_c[4], \"z0\" )\n\/\/? o O ^\n\/\/? | | Z\n\/\/? --o-o-o <X\n\n\n15,vec3f,ffd_c[5], \"y1\" )\n\/\/? --o-o-o < X\n\/\/? | | Y\n\/\/? O o \\\/\n\n16,vec3f,ffd_c[6], \"z1\" )\n\/\/? O o ^\n\/\/? | | Z\n\/\/? --o-o-o <X\n\n\n\n\n---\n\nshadow's and silos do not currently draw properly\n---\n\nyou may need to set\tthe can_warp flag your car and its children dofs\n(you can use copy to selected)\n\n---\n\nPsc op for camera:\n\nview_pitch_0 ==(-5) \/\/ pitch for default view mode (degrees)\nview_pitch_1 ==(-12) \/\/ pitch 2nd view mode (degrees)\nview_pitch_2 ==(-24) \/\/ pitch 3rd view mode (degrees)\n\n\nfloat view_distance_0=(5) \/\/ distance from camera to focal point in meters \nfloat view_distance_1=(8)\t\/\/ for mode 1\nfloat view_distance_2=(16)\/\/ for mode 2\n\n\nfloat ang_v_use=(0.0) \t\/\/ how much angular velocity of car is compenstated for in camera motion\n\t\t\t\t\t\t\/\/ 1 is complete compensation, when turning, the camera will be behind car \n\t\t\t\t\t\t\/\/ rather than lagging\n\n\n\n\n\nfloat cam_min_height=(2.25)\t \/\/ lowest camera is allowed to travel above the ground\n\t\t\t\t\t\t\t \/\/ this should prevent the camera from going through the ground\n\nfloat cam_min_dist=(4.f)\t\t \t \/\/ camera always stays at least this far away form whatever it is watching\n\nfloat camera_stunned_max_dist=(16.0f) \/\/ when camera is stunned, it will lag behind, but be at most this distance\n \/\/ from focal point\n\nfloat slow_height_offset=(1.f)\t\t\t \/\/ when the focal point is moving slowly, this is added to the cameras rest height\nfloat slow_height_offset_max_speed=(8.f) \/\/ the offset decays as the focal point accelerates, reaching 0 at 8m\/s\n\nfloat player_max_height=(8) \/\/ max height above the ground that the player can be before the camera considers \n \/\/ the player to be out of control\n\nfloat player_view_height=(2.5) \/\/ the focal point of the camera (center of screen) is this distance\n \/\/ above the driver (puts the car at the bottom of the screen )\nfloat camera_damp_ratio=(1.25f)\t \/\/ damping for camera motion\n\n\/\/\n\/\/ various spring constants controlling camera acceleration\n\/\/ \nfloat cam_dt_y_default=(0.325f)\nfloat cam_dt_x_default=(0.325f)\nfloat cam_dt_z_default=(0.325f)\n\nfloat cam_dt_too_close=(0.25f)\n\n\nfloat cam_dt_lin_out_of_control=(1.5f)\nfloat cam_dt_lin_out_of_control_catchup=(1.f)\nfloat cam_dt_lin_brake=(0.75f)\n\n\nfloat cam_dt_ang_default=(0.25f)\n\nfloat cam_dt_ang_out_of_control=(0.325f)\n\nfloat cam_dt_turn=(0.25f)\n\n\n\n---\n\n\n\n\ndec 13\n---\n\n warping now occurs on a per frame basis\n\n all occurances of pack_warper_ffd should be replaced with frame_warper\n\n calls to frame_warper::get( ) use a frame (rather than pack)\n\n you can replace ::get(pack) with ::get(pack->get_root());\n\n warping is inherited by children frames (unless a flag in the dof is disabled)\n\n---\n\n bug fix: rtf_key_frame, command->start() would fail\n \n\n\n---\n\n---\n\nCar shock ranges have been moved to the wheel frame dof_ranges:\n\ndof_range[2][0] == how far down it can go (default was -0.125 )\ndof_range[2][1] == how far up it can go (default was 1.0 )\n\n\n---\n\nnew memebers for car:\n\nvec2f,shock_lin_ks)\n\/\/? linear shock [ frequency, damp_ratio ] \n\/\/? governs up down motion of car\n\nvec2f,shock_ang_ks)\n\/\/? angular shock [ frequency, damp_ratio ] \n\/\/? governs pitch and roll stabilization\n\n---\nnew for dof:\n\nbool b_can_warp\n\/\/? if set, the dof supports ffds\n\nbool b_inherit_warp\n\/\/? if set, the dof is transformed by its parent ffd\n\n---\n\nbatches and levels set the view to them when they are selected.\n\nif this is annoying, let me know and I will remove it.\nthis is remove the necessary click - tree open close to view a batch\n\n---\n\ndw_max_car, saved as and updated:\n\n - ffd_exents\n - wheel dof ranges\n - environment maps removed\t (some where out of order)\n - some wheel spokes are not bound the the wheel dof\n\n\n---\n\n camera now sets the focal point to the player or Ai, if there is one\n if both player and AI are in the car, put them in the same position (it will use the first it finds)\n\n---\n\npatches draw their circle as white if collisions are disabled.\n\n\n---\n \n\n\ncld_prim hook priority update:\n \n - scalar value from 0 .. 399\n - 0 is top priority\n - 350 is default\n - 399 is lowest\n\n\n convention:\n \n A-0 == 100\n B-0 == 200\n C-0 == 300\n\n A-1 == 101\n B-1 == 201\n C-1 == 301\n\n A-N == 100 + N\n B-N == 200 + N\n C-N == 300 + N\n\n\n(Daniel)\n---\n\n\ndec 12\n---\n\nfov shift based on speed removed\n\n\n---\n\nCamera control improved. \n\nAngular velocity feedback was removed (it did not exist in prototype), this caused the camera to align with\nthe orientation of the car too quickly when turning. (jerky camera motion when you swerve)\n\n---\n\nlegacy actuate_kd remove (daniel)\n\n---\n\nThese mod2k.psc settings might be useful:\n\n\ndisable_driver_warning 1\n\/\/ Andy would hate me\n\n\nshow_player_input 1\n\/\/\n\/\/ this will show steer, and thrust.\n\/\/\n\/\/ If you use a gamepad, see if these values reach 1.0, if they do not, your game pad needs\n\/\/ calibration\n\/\/\n\n\n(dan,rich)\n---\nnew for l1 car:\n\n\n28,vec3f,ffd_inertia_default)\n\/\/? Inertia effects on ffd (rear, mid, front)\n\/\/? 1.0 means that an acceleration of 16 m\/s\/s will \n\/\/? apply a force to the ffd_points sufficient to deform the ffd\n\/\/? by \"1 ffd unit\"\n\n\n29,vec3f,ffd_inertia_acc)\n\/\/? see ffd_inertia_default\n\/\/? Applied when in flight\n\n30,vec3f,ffd_offset_acc)\n\/\/? when car is in this state,\n\/\/? the z components of the ffd will be deformed\n\/\/? by this amount (rear, mid, front )\n\/\/? e.g. 1,0,0 will raise the rear of the car\n\n\n\n31,vec3f,ffd_inertia_turn)\n\/\/? see ffd_inertia_default\n\/\/? Applied when in flight\n\n32,vec3f,ffd_offset_turn)\n\/\/? see ffd_offset_acc\n\n\n\n33,vec3f,ffd_inertia_brake)\n\/\/? see ffd_inertia_default\n\/\/? Applied when in flight\n\n34,vec3f,ffd_offset_brake)\n\/\/? see ffd_offset_acc\n\n \n35,vec2f,ffd_drive_ks)\n\/\/? { frequency, damping }\n\/\/? sets spring constacts for ffd when car is driving\n\n36,vec2f,ffd_flight_ks)\n\/\/? { frequency, damping }\n\/\/? sets spring constacts for ffd when car is flying\n\n\n37,float,roll_wheel_offset)\n\/\/? determines how much cars bank when accelerating sideways\n\n---\n\nCES todo:\n\n\n* Acceleration from a stop needs to do a wheelie and compress, \n currently it only does an exaggerated wheelie (needs to return to prototype functionality)\n\n - ffd_inertia_acc\n - ffd_offset_acc\n\n\n\n* General acceleration needs to function exactly like the prototype\n - reduce acceleration in l1_rtf_car\t functional\n\n\n* Car braking needs to be EXACTLY like the prototype. \n (squashing, stretching, etc) (but keep the fix for spinouts when braking.\n\n - ffd_inertia_brake\n - ffd_offset_brake\n - modify brake rate in l1_rtf_car functional\n\n\n* Sliding and Skidding needs to be EXACTLY like the prototype.\n - adjust friciton setting in l1_rtf_car\n - cars are faster to friction needs to be higher\n\n\n* Car should only bend around corners as much as it did in the prototype.\n - ffd_inertia_turn\n - ffd_offset_turn\n - roll_wheel_offset\n\n\n* On turn, cars need to pop up on two wheels and then bend, currently neither is happening correctly \n (go back to the prototype!)\n - ffd_inertia_turn\n - ffd_offset_turn\n - roll_wheel_offset\n\n\n\n\n\n\n\ndec 9\n---\nmaterials.dat updated.\nadded stickyness, \nremoved various legacy materials, params \n----\n\n\n\ndec 8\n---\n\n\nbug fix:\n\nright mouse click was inaccurate\n\n(rich)\n---\n\n\ncar spinout disabled\n\n---\n\nmake_hull fixed\n\n---\n\ntip for fast lods:\n \n set silo_gain to 0\n it may not be as good, but it will be WAY faster, and suiteable as a placeholder\n some meshes look better this way\/\n\n\n---\n\nnew var: cld_draw_mode\n\n 0, \/\/ lowest_detail, fastest: 54 faces\n 1, \/\/ lowest_detail, fastes150 faces\n 2;\t \/\/ lowest_detail, fastest: 300 faces\n\n\n\n previous default was 1, now it is 0\n\n---\n\nnew:\n\n make_from_mesh_2\n\nanother way to make a hull;\nsimilar to make_from_mesh() except that it autosimplifies in some cases.\n\nThe faces output should have little to do with the number selected\ngood for high vert meshes\n\n\n---\n\nmouse right click bug fixed, new gameos\ndid not rethrow rbutton as \"menu\"\n\n---\nexported g_max weapons:\n\n add this line to your code to use:\n\/\/ declare \n__inertia_export extern int g_max_weapons;\n\n\/\/ then use g_max_weapons\n\/\/ g_max_weapons is the max pickups that you can carry, total max weapons is g_max_weapons+1 (tennis gun)\n\ndefault for g_max_weapons is now 1\n\n(rich)\n---\n\nnew flag for ed_patch: b_collisions\n\n(rich)\n---\n\nmounts auto replace\n\n---\n\nnew exes up, including demo.exe\t and demo_profile.exe\n\ndemo profile should be used for profiling\n\n(daniel)\n---\n\n\n\ndec 3\n----\n\ngameos update. GameOS now supports DX7.\n\nGood luck\n\n\nYou will need to update your assets dir with S:\\w\\assets \n---\nthere are updated psc files on S:\\w\\ with useless stuff removed\n\n---\n\n\ndec 2\n----\nNew for pack:\n \n extents_3d rt_pack::compute_local_extents() const;\n\n\tcomputes combined extents of all frames;\n\n\n(daniel)\n---\nNew for rt_func:\n\n enum say_targets\n {\n say_log, \/\/ the console window\n say_file, \/\/ writen to toon\/mod.log\n \/\/\n \/\/ text bubbles drawn on screen\n \/\/ say_bubble_N replaces the last say_bubble_N message\n \/\/ say_bubble_0 is , say_bubble_1 is top right, say_bubble_2 is bottom right, say_bubble_3 is bottom left\n\n say_bubble_0, \/\/ top left \n say_bubble_1, \/\/ top right\n say_bubble_2, \/\/ bottom right\n say_bubble_3, \/\/ bottom left\n };\n\/\/\n\/\/ usage: __say((\"Hello %s %.1f\", pack->get_name().s, dy_eng.t() ))\n\/\/ __say_2(file, (\"Ammo: %d\", ammo_left))\n\/\/ note the bracket style\n\n __say_2(target, msg )\n __say(msg)\n\n\n---\nNew for ed_func:\n\nbool b_verbose;\n\/*?\nThis flag enables the say() function for funcs, if verbose is not set, say() will have no effect\n*\/\n---\nYou will need to wipe rtd\n---\nbug fix: \n sprites with blend_mode == pseudo_alpha\n would not draw\n\n----\n\n\n\ndec 1\n---\n\nsmall fixes to pickups\/weapons\n\n\n---\n\n\n\nnov 29\n---\n\nNew driving model:\n\n Please try out: dwtracktest0\n \n dw_sasha_baby0 is the ONLY car that will drive properly now.\n First thing tomorrow morning I will update others.\n\n Most levels should work, but they are not yet tested :\\\n\n\n(david)\n---\n\n\nWheels now modulate their friciton scale by the combine friction of the world and the wheel\n\n\n\nmaterials.dat updated:\n\nToon Wheel friction index id changes to 6\t ('med tire')\nI set its friction vs most materials to 1\n\n- Update, actually this is not implemented yet, but it will be\n\n---\n\nnew psc op:\n\n smooth_inputs 0 \/\/ use this if you have an analog game pad\n or\n smooth_inputs 1 \/\/ use this if you have a digital pad.\n \/\/ steering will be smothed out\n\t\t\t\t \/\/ e.g. when you press left it will take 0.25 seconds to reach the max turn angle\n\n \n---\n\n\n\nnov 26\n---\nupdate for dofs:\n\n rather than \n\n frame::b_at_joint_limit\n \n use\n\n frame::is_at_joint_limit()\n\nrt_dof->actuate_qd() and \nrt_dof->actuate_qdd() now take a priority.\n\nchoose a priority in rt_frame.h\tthat is suitable\n\n(see enum actuate_priority )\n\ne.g. f->actuate_qdd( qdd, \t frame::ap_character_0 );\n\n\n---\n\n\nnov 25\n---\n\n\nMounts:\n---------\n\nThe following new members determine mount allocation:\n\n\n\n\nrt_pack:\n\nmount_type\nmount_locations[4];\n\n\n\nrtf_mount:\n\nm_type\n\/\/? A filter specifying what can be mounted here\n\/\/? a pack can only be mounted here if pk->get_l1()->mount_type == mount->m_type\n\n\nm_location\n\/\/? describes where I am, this is used by packs for them to select a mount that they like\n\/\/? each pack stores up to 4 mount locations ordered by preference.\n\/\/? if none of the pack locations matches the mounts location, the mount will not be considered\n\/\/ the l1_pack::mount_locations[0] which have precedence over l1_pack::mount_locations[1] and so on\n\nm_capacity\n\/\/? describes how much I can carry\n\n\nexamples:\n\n\ndw_sasha_baby0 has mounts set up:\n\ndw_hammer has the following setup\n\n mount_type == weapoon\n \n mount_location[0] == top\n mount_location[1] == misc\t(not used)\n mount_location[2] == misc\t(not used)\n mount_location[3] == misc\t(not used)\n\n\n\ndw_weapon_buzz_saw has the following setup\n\n mount_type == weapoon\n \n mount_location[0] == left_hand\n mount_location[1] == right_hand\n mount_location[2] == misc\t(not used)\n mount_location[3] == misc\t(not used)\n \n\t\t\t\t\t\t \n\n\n---\n\n\n\n\nnov 24\n---\n\n\n\n---\n\nnew psc ops:\n speed_up\t(real_time_rate *= 2)\n slow_down\t(real_time_rate *= 0.5)\n pause (brings up dialog)\n\n---\njoystick buttons can now be bound to function calls in addition to signals\n\ne.g.\n\nbind joy_5 speed_up\nbind joy_6 slow_down\n\n---\n\nthe compile date is now printed on toon.exe title bar\n\n---\n\n\nfix: setting a meshes data did not set it's pack to modified\n\n(rich)\n---\nupdates to get_name() functions:\n\nThere is a \"w\" (unicode) and an \"a\" (ansi) version.\nuse the ansi version, until gos supports unicode\n\n\nName functions:\n\nrt_pack::get_name_a();\nrt_pack::get_short_a();\n\nrt_func::get_name_a() (verbose, for debugging)\n\nrt_frame::get_name_a() (verbose, for debugging)\n\nframe_bacth::get_name_a()\n\n\nyou will need to del rtd\n---\n\nWhen testing the build, please do not disable warnings until\n\nthe zip is made (and check log for errors)\n---\n\nerrors created by toon.psc (or mod.psc) \nwill be written to:\n\ninit.log\n\n(this be b\/c GOS is not yet initialized)\n\n---\n\n \n new psc op:\n d3d_device 0\n\n (0 is d3d_hardware, \n 1 is d3d_software (unstable), \n 2 is d3d_software (stable),\n 3 is fast software (Blade) )\n\n new psc op:\n antialias 1\n\n\n\n\n\nnov 23\n---\n\nbug fix: cld reps for children frames would draw in an incorrect coorindate system\n\n---\n\nUpdates to Silos and Shadows:\n\nShadows and silo's are taking up a lot of the rendering time, I've added functionality to\noptimize their usage.\n\n- surfaces can set or disable shadows (used to be pack)\n- surfaces can set or disable silo (used to be pack)\n- surfaces can specify a silo color\n- surfaces can specify a silo thickness (default == 1.5 pixels)\n\n- Meshes can specify how close the mesh must be for the silo to draw\n- Meshes can specify how close the mesh must be for the shadow to draw\n\n---\n\n\n\nnov 22\n---\n\nI recompiled with an updated version of GameOS. \nPlease let me know if find any problems.\n\n\nThanks!\n\nAlso, Rich: if the DLL crashes let me know (!)\n\n\n---\n\n\nbug fix:\n\n\"remove from list\" only worked if the container was at the root of the tree.\n\n\n e.g. textures::remove_from_list() didn't work\n---\n\nNew and exciting behaviour for A, S keys\t(with or without shift)\n\n---\n\n\nyou can now set the focal_distance distance in the mesh view\n(this is how far out you stay when you zoom)\n\n---\n\ncontrol-W will plant a watch point ahead of you points.\n\n---\n\n'z' zooms in your view\n\nmultiple presses will toggle between scales of focal_distance\n\n---\n\n\nmouse drag motion filtered to zero all but one axis.\n\nif( drag_z )\n{\n\/\/ Wheel\n drag_x=0;\n drag_y=0;\n}\nelse\n{\n\tif( abs(drag_x) > abs(drag_y) )\n\t drag_y=0;\n\t else\n\t drag_x=0;\n\n}\n\nif your mouse doesn't work well, please let me know\n\nthis is to mitigate the extreme difficulty of moving the mouse along only one axis\n\n---\n\n\n\nnov 21\n---\n\ned_surface::selece_verts\ned_dof::select_verts\n\nif all verts in the dof\/surface are selected, they will all be unselected.\nOtherwise they will all be selected.\n\n\nif some verts in a dof are selected, if you call this twice they will all become deselected\n\nthis replaced ed_dof::unselect() \n\n---\ned_dof::select_verts_tree()\nselects all verts in the dof and any of the dofs children\n\n---\n\n\nLevels now have an \"ambient\" value\nthis is written when the level starts sim\n\nyou can set ambient with psc ops using:\n\nambient_r 0.5\nambient_g 0.3\nambient_b 0.1\n\n\n---\n\ncld rep draw updated. slower but more accurate\n---\nsurface combining now takes place at run time. \n\nThis allows you to keep extra surfaces in the editor with the performance benefit of\ncombining.\n\nTexture combining still takes place in the editor\n---\n\nto transfer faces from one surface to another:\nclear selected (press 'Q')\nright click on surface A, choose select_faces()\nright click on surface B, choose add_selected()\n\n\n---\n\nThe order in which dofs appear in their parents list at run time is determined\nby alphabetical order.\n\nIn cupid I named the chest's children:\n\n0 right arm\n1 left arm\n2 head \n\ne.g:\n\nconst int dof_id_head = 2;\nchildren[dof_id_head ] would predictably be the head.\n\n\n---\nCertain common vec_stack operation are now available on the right click menu of vectors:\n\nzero()\nnegate()\nnormalize()\nrotate_z() \nrotate_x() \n---\n\nadded unselect_verts() to dof\n\n---\n\nadded select_reflected to ed_mesh\n\n(selects verts that are reflections in Y of selected vert)\n\n---\n\nadded select_connected_1 to ed_mesh\nadded select_connected_10 to ed_mesh\n\n\nincremental verts of select_connected()\t [ e.g. select only 1, or select up to 10 ]\n\nprioritization is assinged based on edge legth. (closer verts are selected first\n\n\n---\n\nif you attach half the verts of a simetric figure to verts you can do this:\n\nclear_selected()\nleft_arm->select_verts()\nmesh->select_reflected()\nleft_arm->unselect_verts()\nright_arm->add_selected()\n\n\n\n---\n\n\nnov 20\n---\n\nWheels for vehicles are no longer separate packs\n\nRecommended setup for cars:\n\n Single mesh containing car and all wheels (ideally sharing a texture)\n \n 4 Wheel Frames set to \"[33k] kinematic\" (the last one on the drop list)\n each with:\n special == wheel\n mass == 1\n I == 1 1 1\n no_mass true\n kinematic true\n local_sim true\n range_wraps true\n \n These are for visuals ONLY, they do not have collision reps \n\n \n 4 wheel cld_spheres in the ROOT (not the wheel frames)\n each marked with special==wheel\n radius = 0.5\n\n\n\n see dw_sasha_baby for an example\n\n---\n\n if you set draw_extents in the camera and you have set explicit ffd extents for a pack, they will be drawn\n as a white extent box\n\n\n---\n\n dw_spy_car:\n\n FFD extents set\n \n Pack Centered\ts.t. Wheels are symettric in X and at -0.19 in Z (as per previous Spy Car)\n\n cld hull scaled a bit smaller in Y (to avoid hitting your side so often\n\n mass from 128 to 712\n\n wheel verts bound to appropriate dofs\n\n max draw distance 512\n\n Daniels slide smoke replaces blue smoke\n\n car l1 data reverted to Daniels dp_spy_car\n\n made brighter\t(higher ambient)\n \n lods created\n \n\n---\n\n ed_mesh->filter() now removes overlapping faces\n\n(rich)\n---\n\n\n\n\n\nnov 19\n---\n\n\n\nchanged\n \n rt_message::s_collision\n\n msg->b_cancel_collision = true;\n\n has been replaced by:\n\n inline void skip_prim() { action_flag = action_skip_prim; }; \/\/ skips the contact between this prim and the other\n inline void skip_frame() { action_flag = action_skip_frame; };\/\/ skips all contacts between this frame and the other\n\n inline void skip_tree() { action_flag = action_skip_tree; }; \/\/ skips all contacts between this frame and\n \/\/ all of its children frames\n \/\/ and the other\n\n\n\n use skip_frame() for the behaviour of msg->b_cancel_collision = true;\n \n skip_tree() may be more appropriate for most weapons\n \n\n---\n\n each collision prim has a \t\"hook_priority\"\n The rtm_collision is sent first to the prim with the higher priority. \n If the collision is canceled, the other prim will not recieve notification messages. \n\n Proirities for weapons\/effects should be decided on by designer\n\n\n(Daniel)\n---\n \ncars:\n\n ffd extents should coincide with wheel contact points\n\n wheel prims should have \"special wheel\" set \n wheel frames should have \"special wheel\" set\n \n wheel frames are for visuals only;\n \n Please see: dw_sasha_baby for an example\n\n\n---\n\n rt_pack::find_first_func() now supports custom_funcs\n \n you can use the macro:\n \n __find_custom_func( pk, _name_ );\n or \n __find_custom_func_tree( pk, _name_ ) if you want to recurse through the packs children.\n\n _name_ is the name of you functional without rtf_\n\n e.g.\n\n rtf_dw_mole * mole = __find_custom_func_tree( pk, mole );\n\n returns 0 if no custom functional of that type exists.\n\n--\n\n\n \n \n\n\t\t\t\t\t\t \nnov 18\n---\n\nSetting up Spew:\n\n In mod (and in next mayhem build) you can set the debug output in the psc:\n\n Use the following format:\n\n spew \"groupA groupB groupC ...\"\n \n Where \"groupA\" is a spew type.\n \n This is the default setting:\n\n spew \"physics game net collision_detection editor david\"\n\n To debug directinput stuff use:\n\n spew \"GameOS_DirectX GameOS_DirectInput physics game net collision_detection editor david\"\n\n\nThe following are supported\n\n#define GROUP_FILES\t\t\t\t\"GameOS_Files\"\t\t\t\/\/ File functions\n#define GROUP_MEMORY\t\t\t\"GameOS_Memory\"\t\t\t\/\/ Leak notification only\n#define GROUP_MEMORYVERBOSE\t\t\"GameOS_MemoryVerbose\"\t\/\/ Heap create \/ destroy functions\n#define GROUP_TEXTURE\t\t\t\"GameOS_Texture\"\t\t\/\/ Texture enumeration and creation\n#define GROUP_GAMEOS\t\t\t\"GameOS_Core\"\n#define GROUP_NETWORK\t\t\t\"GameOS_Network\"\t\t\/\/ Networking messages (DPlay layer is lower level)\n#define GROUP_DIRECTX\t\t\t\"GameOS_DirectX\"\n#define GROUP_DIRECTDRAW\t\t\"GameOS_DirectDraw\"\n#define GROUP_DIRECT3D\t\t\t\"GameOS_Direct3D\"\n#define GROUP_DIRECTINPUT\t\t\"GameOS_DirectInput\"\n#define GROUP_DIRECTSOUND\t\t\"GameOS_DirectSound\"\n#define GROUP_DIRECTSHOW\t\t\"GameOS_DirectShow\"\n#define GROUP_DIRECTPLAY\t\t\"GameOS_DirectPlay\"\n#define GROUP_WINDOWSMESSAGES\t\"Windows_Messages\"\t\t\/\/ WM_ messages from windows\n\n\n\nnov 17\n---\nOptimization:\n\n for dofs that don't require dynamics, and that are very light, you should set:\n \n kinematic = true\n and \n no_mass = true\n\nThis will speed it up, but the childs inertia will not effect the parent.\nAlso, these dofs will not accept external forces they must be moved using \nan input signal or by calling actuate_qdd() on the dof\n\n\nGood Candidates:\n \n \"light\" weapons\n kinematic animation parts (currently all of the cupid's parts has this setting)\n\n\n\n\n\nnov 16\n---\n\nnew for frame: void scale_collision_rep(const vec3f & scale );\n\nthis internally calls f->shared_to_custom();\nif you want to restore the original frame, use\n\nf->custom_to_shared();\n\n(daniel)\n\n\n\nnov 14\n---\n\n If you are bored, try this:\n \n set you car to: conent\\david!\\batches\\scars\\dw_sasa_baby.dwb\n run: conent\\david!\\levels\\dwtracktest.dwl\n \n---\n\n you will need to wipe rtd and recompile your dlls, \n thanks!\n\n---\n\n\nnov 12\n---\n\nedge reps will need to be regenerated due to a format change\n\n---\n\nif you use l1_frame::composite_mass in your dll, \nyou need to replace this with get_mass()\n\ne.g.\n\n f->get_l1()->composite_mass\n \n to \n\n f->get_mass();\n\n \n---\n\n\nupdate to rtf_weapon::ammo_info\n\n struct ammo_info\n {\n enum type\n {\n type_none, \/\/ invalid, ammo not relevant\n type_int, \n type_float,\n };\n type m_type;\n\n union\n {\n float f_count;\n int i_count;\n };\n union\n {\n float f_max;\n int i_max;\n };\n\n\n inline void set( float count, float max ) { f_count = count; \n f_max = max; \n m_type = type_float; }\n inline void set( int count ) { i_count = count; \n i_max = max; \n m_type = type_int; }\n\n \/\/\n \/\/ returns between 0..1.0, 0 is empty, 1 is full\n \/\/\n inline float get_ratio()\n {\n if( (type == type_none)||((i_max<<1)==0) )\n {\n \/\/ error\n return 0;\n }\n else if( type == type_int )\n {\n return float(i_count)\/float(i_max);\n }\n else\n {\n return float(f_count)\/float(f_max);\n }\n }\n\n };\n\n(rich)\n---\n\n\nnov 11\n---\n\nbug fix: target_lc was not saved for packs\n \n---\n\nnew setting for texture map blend:\n \n pseudo_alpha:\n \t This is for color keys\n\t and textures with alphas that are usually 0 or full.\n\t This is slightly more efficient that normal alpha\n---\n\nNew for texture:\n\n bool auto_set_blend_mode,tab_other\n \n If this is set and the texture has alpha or a color key,\n the blend mode will be set to pseudo_alpha\n\n---\n\n\nnov 10\n----\nnew setting for psc:\n\n background_color 0x0000c0\n\n (or any rgb combination)\n\n this is only used in toon.exe, mod2k overrides it with the user setting\n\n\n---\nbug fix: save_as did not set the modified flag\n\n(rich)\n---\n\nbug fix: physics step rate was not set properly in toon.exe\n\n---\n\nfile system optimizations, better caching and faster export\n\n---\nif files are stored as bmps and tgas, the older file will be deleted.\nthis avoids conflicts where you update a bmp, but it loads the tga at run time.\n\n\n---\n\n\n\nnov 9\n---\nnew for pack warper:\n\n\n \/\/\n \/\/ read\/write positions\n \/\/\n \/\/ to use reads: declare a coordinate system that you want to use, and pass a\n \/\/ typed ffd_q to the function\n \/\/\n \/\/ e.g. ffd_q_type<ffd_q_3> result;\n \/\/ ffd->read_q( &result );\n \/\/\n __inertia_export void read_q( ffd_q_typed_header * p_result ) const;\n \/\/\n \/\/ to use writes for modify:\n \/\/ \n \/\/ - deflare an ffd_q\n \/\/ - if you want to modify values,\n \/\/ - call ffd->read(&q)\n \/\/ - modify values\n \/\/ - call ffd->write( q );\n \/\/ if you want to write values and you don't care what they used to be.\n \/\/ - set values \n \/\/\n \/\/\n __inertia_export void write_q(const ffd_q_typed_header & values );\n \n(rich)\n---\n\ncropped environment maps seem to work, but they are very subtle so I am not completely sure\n\n\n(rich)\n---\n\n weapons have a new l1 flag: \n \n bool b_uses_targeting\n\/\/? set this flag if the weapon uses targeting and \n\/\/? approriate information should be displayed on the hud\n\n\n---\n\n weapons have a new l1 member: \n\n\n texture m_hud_image\n\/\/? Specifies the texture that the weapon uses to draw on the hud\n\n---\n\n \/\/\n \/\/ new for rtf_weapon:\n \/\/\n\n struct ammo_info\n {\n enum type\n {\n type_none, \/\/ invalid, ammo not relevant\n type_int, \n type_float,\n };\n type m_type;\n\n union\n {\n float f_count;\n int i_count;\n };\n\n inline void set( float count ) { f_count = count; m_type = type_float; }\n inline void set( int count ) { i_count = count; m_type = type_int; }\n\n\n };\n \n\n \/\/\n \/\/ if the weapon supports ammo, this function should be overwritten.\n \/\/ call p_result->set(ammo_count), pass an ammo type as either a float \n \/\/ or an int\n \/\/\n virtual void get_ammo_info(ammo_info * p_result); \n\n\n---\n\nrtf_weapon::do_i_have_ammo() is obsolete, use get_ammo_info() instead\n\n---\n\n\n\n\nnov 7\n---\n\nenvironment map first pass, please see dw_spy_car_blue and dwtesttrack for an example\n\n\nEnvironment maps how to:\n \n - environment must must be the second texture of a surface\n - the first texture must be solid or color keyed\n \n - the environment map should have a fill mode of add or alpha\n - the environment map should have a uv_gen_function that is not \"Vertex Values\"\n [mod2k: uv_gen_function drop box ]\n [piapi:. you can use tex->get_rt()->m_uv_gen_function = rt_texture::uv_gen_sphere; ]\n \n - specify cropping if applicable \n [mod2k: crop_origin, crop_span ]\n [piapi: tex->get_rt()->crop_origin ]\n [piapi: tex->get_rt()->crop_span ]\n\n - currenlty all gen modes use sphereical projection.\n this allows for cropped textures (it does not need clamp or tile)\n\t\n\nSharing textures:\n\n on cards with 2 texture units (most cards out right now)\n you are best off having as many objects as possible sharing a common environment map.\n\n\n\n---\n\na few of the ed_texture members are now only stored in the rt_texture;\n\nfor example, insteading of setting a textures fill mode, do this:\n\nfrom:\n tex->fill_mode = rt_texture::blend_replace\nto\n tex->get_rt()->blend_mode = rt_texture::blend_replace\n\n\nsome added members are:\n \n tex->get_rt()->crop_origin\n tex->get_rt()->crop_span\n tex->get_rt()->m_uv_gen_function\n\n\n\n(Rich)\n\n---\n\n FFD's sould be pretty functional right now.\n please let me know if you notice any problems\n\n\nexample use from dw_thunder_cloud.cpp:\n\n \n pack_warper_ffd * ffd = pack_warper_ffd::get( pk );\n \/\/\n \/\/ only apply force if this can warp\n \/\/\n if( ffd )\n {\n\n static const acceleration_to_ffd_force = 2.5f; \/\/ q'' -> force gain\n static const ffd_period = 1.0f; \/\/ period of 1 second\n static const ffd_damp_ratio = 0.5f; \/\/ damp ratio of 0.5 (under damped\n \n ffd_q_typed<ffd_q_1x> F; \/\/ declare a force pertubing a 1d spline along x\n\n \n \/\/ set spring damper constants\n ffd->set_from_dt( ffd_period , ffd_damp_ratio );\n \n svecf acc = f->m_dof->get_acceleration(); \/\/ get acceleration\n \n vec3f ffd_acc = t_dot( f->m_gb.A, acc.lin ) * (- acceleration_to_ffd_force ); \/\/ transform linear component\n \/\/ into local coordinates of the frame\n \/\/ negative because the middle\n \/\/ point should move opposite to the\n \/\/ acceleration of the frame\n\n F.q[1] = ffd_acc; \/\/ write the force to the middle point\n \/\/ this makes it bend\n\n ffd->apply_force( F ); \/\/ apply the force\n\n\n }\n\n\n\n---\n\n\n\nnov 4\n---\nmany changes to the deform API, if you have ffd calls in your code, please #if 0 these until we meet this afternoon,\nand discuss everything\n\nThanks,\n\n---\n\nnov 3 \n---\nMultiple power ups, new implementation:\n\nWeapons that are powers that may be assigned to arbitary triggers should set their sub_target_id to\n\"Weapon [Free]\". \n\nPickups will not replace already mounted packs.\n\nFuncs now store an l0 copy of l1->sub_target_id\nThis will be reassigned when a mounted weapon is mounted. \nbased on whichever trigger is available. \n\nNew psc op: \"max_weapons 3\"\nThis sets the max weapons per car. 3 means up to 2 powers and a primary.\n\nRemember to add an extra mount to your cars (just copy and paste)\nand to add trigger_2 to controls.psc\n\n---\n\nrecommended setting for pickup crates:\n \n root frame:\n\n 6 dof\n 16 kg mass\n\n pack:\n\n normal collision mode\n can_be_sliced\n can_deform\n\n\n\n\n\nnov 1\n----\nai targeting etc has requires some updates to weapons:\n\nin l1_rtf_weapon please set:\n\nvec2f,target_range\n\/\/? Min and Max range at which target should be for us to shoot\n\ntarget_cone_radius\n\/\/? Radius of targeting cone, if target is outside of a cone along this cars X axis of radius \n\/\/? target_cone_radius, the target is considered to be out of range\n---\n\n\noct 30\n---\n\nNormals are now shared for verts that have the same position but are part of the same surface with different uvs.\n\n---\n---\n\n\noct 29\n---\n\nUpdates to l1_rt_pack:\n\nbool cast_shadows\n\n If this is set, the pack will cast shadows\n When the mesh is changed you must call \"update edge rep\"\n in order for shadows to be drawn correctly.\n If cast_shadowss and draw_silo are false the pack will clear\n any current edge reps as they are not needed\n \n\n\nbool draw_silo\n\n If this is set, the pack will draw its siloette (edge outline)\n When the mesh is changed you must call \"update edge rep\"\n in order the siloette to be drawn correctly.\n If cast_shadows and draw_silo are false the pack will clear\n any current edge reps as they are not needed\n\n\nvec3f silo_color\n\n Color of the siloette for this pack\n only used of draw_silo is true\n\n\n\nI know that max supports a \"cast shadows\" flag for meshes, I am not sure if it supports any bonus\nflags that could be used to specifiy whether or not silo should be drawn.\n\n(minimal support might be a check box in the export dialog box?)\n---\nA few of my weapons were too heavy:\n \n - buzz saw was about 64 kg, has been reduced to 24\n - booser rocket was 128 kg\n\n---\nImproved generating of edges for collision rep and shadow rep.\nNote: this it is now a N^2 process and it is recomputed at load, so it may be slow.\n\n---\n\nI've added silo's to my objects and exported my track.\nPlease let me know what you think of the way in which it looks\n\nThanks.\n\n---\n\nEraser gun:\n\n Mark when eraser misses is now white\n The mark has a portable hole functional in it so it will suck you down \n (unless of course, you have the mole functional)\n Eraser gun will seek if you have a target\n\n\n---\n\n Your current target is now highlighted with a \n cube. The is a temp placeholder\n\n---\n\n \n\n\noct 28\n---\n\n piapi:\n \"frame_i.h\" has been renamed \"rt_dof.h\"\n you may need to change your include files\n\n \n---\n\n Weapon updates:\n\n\tMole now has a limited number of uses (default is 4)\n\n Portable hole has a limited number of objects that it can suck up. (default is 4) \n\tand a limited maximum existance time (30 sec)\n\n\tBooster rocket a little faster and smoother flying\n\n Portable hole does not play uh-oh when the user has the mole\n\n\n\tWhen the mole resurfaces, it creates a temporary hole that acts as a portable hole for 8 seconds\n\n\n\n---\n\nHazard Avoidance \n\n\navoidance\n\n Avoidance flag used by ai's to determine what to avoid\n This should only be set for Hazards that are serious, otherwise the\n Ai's racing ability will be compromised.\n Examples might include: Portable Hole, maybe Tornado\n stationary dropped weapons (e.g. bombs)\n\n\nradius_as_obstacle\n\n When avoiding hazards, ai's will attempt to ensure that \n the \"obstacle sphere\" of the AI and the \"obstacle sphere\" of the hazard\n do not intercept.\n The \"obstacle sphere\" is defined by the origin of the root pack with a \n radius of \"radius_as_obstacle\"\n e.g. if a portable hole has radius == 2 and an AI has radius == 1, the\n AI will ensure that her center of mass is at least 3 metters to the left or \n right of the hazards center of mass\n Default for Packs is 2.0 (This is the current setting for AI packs)\n\n---\n\n\n\n\noct 27\n---\n\nSmoosh handler has been updated, new waves have been added.\n\nPlease replace your level smoosth_handler_pack with the pack in \ncontent\\david!\\batches\\dw_smoosh_handler.dwb\n\n---\n\nfirst pass on mole\n\nplease see dw_crate_mole\n\n---\nfirst pass on painted tunnel (needs a LOT of work)\n\n\nplease see dw_painted_tnnel.dwb or dwtracktest.dwl for a level\nwith the painted_tunnel in it.\n\n---\n\nFirst pass on Quake hammer, \n\nplease see dwtracktest.dwl for a level\nwith the hammer in it.\n\n---\nwar.exe is now toon.exe\n\nyou will need to:\n\n change your dll to *_toon.dll from *_war.dll\n link it with toon.lib rather than war.lib\n\n rename war.psc toon.psc\n\n---\n\n\n\noct 26\n---\nnew api for g_level:\n \n \/\/\n \/\/ enumerates all objects whose extents touch the extents specified\n \/\/ applies no filters\n \/\/\n\n void enumerate_objects_in_extents( darray_buf_ls<rt_pack*> * p_result, const extents_3d & ext );\n\n\n---\n\n ed_mesh::filter() no longer requires an active view\n\n---\n\n\n\noct 25\n---\n\nfirst pass on dw_booster_rocket, \n\ndavid!\\bactch\\weapons\\dw_crate_booster_rocket\n\n---\n\nupdate to quatf::set_x() method\n\nPrevious this aligned the x axis of the basis to the specified axis using the minmum rotation from the identity.\nNow it aligns the x axis of the basis using a rotation that minimizes roll. \n\nThis tends to be applicable more often (e.g. if you set the heading of a car, you want the Z axis to be as close \nto up as possible)\n\nthe function has singularities, namely straight up or straight down. x == (0,0,+\/-1)\n\n\n\n\noct 21\n---\nThere have been a few minor changes to the API rt_func::set_switch() api\n\nAll code should compile as is, it if does not, please let me know. \n(To my knowledge, no one is\tusing the changed functions)\n\nAll calls to set_switch() will be passed through the rt_message_proc, to provide you with the \nopportunity to hook the messages before they reach rt_func.\n\nThe default behaviour of the rt_func when it recieves this message is to call set_switch_i()\nif the operation is not on its \"ignore list\"\n\nPreviously funcs have the following trigger actions:\nignore\nturn on and off\nturn on \ntoggle\n\nThese have been replaced by two bools:\n\n bool b_ignore_turn_on : 1; \/\/ if this is set, the func will regject the set_switch() message\n \/\/ if the operation is sso_on\n\n bool b_ignore_turn_off : 1; \/\/ if this is set, the func will regject the set_switch() message\n \/\/ if the operation is sso_off\n\n\nRequired changes:\n\n All weapons that were previously set to anything other than turn_on_and_off() will need to be updated.\n\n If the previous setting was \"turn_on\" (e.g. tennis ball gun) the new settings should be:\n\nb_ignore_turn_on: false\nb_ignore_turn_off: true\n\nthe default is false for both.\n\n\n(Dan)\n---\n\n\n\n\noct 20\n---\nyou will need to remake shadow reps (sorry format change)\njust call \"make shadow rep\"\n\n---\n\nalpha and add mode should work for packs\n\n---\n\nthe render pipline was rewritten for alpha and add mode packs, please let me know if you\nfind anything broken.\n\n---\n\nbug fix: case sensitivity in network folder name comparison\n\n\n---\nupdate to rt_pack api:\n \/\/\n \/\/ destroys the pack, if it has a spawn point set it will reappear at that point\n \/\/ if respawn_delay is left at 0, the default respawn delay is used, otherwise it passed value is used\n \/\/ the default is about 4 seconds.\n \/\/ \n __inertia_export void __fastcall self_destruct(float respawn_delay = 0.0f );\n\n---\nbug fix:\n\nmayhem is no longer terminated when pack should respawn\n\n---\n\nfirst pass on portable hole\n(dw_portable_hole_crate)\n\n---\n\nfirst pass on eraser gun\n(dw_eraser_crate)\n\n---\n\n\n\noct 20\n---\nminor updates to camera scripting functions:\n\nrt_camera methods:\n\n\n void go_to(const vec3f & position, \n const vec3f * focal_point=0, \/\/ if this is set, the focal point will be set to a \n \/\/ fixed point\n \/\/ otherwise it will be the players car\n bool instantaneous=false ); \/\/ instantaneous will cause a teleport\n\n \n \/\/ this should be called after using go_to() or set_stunned to return the camera to its default control\n \/\/ system\n\n void restore_normal_control(); \n (was do_normal_control() )\n\n\n\nglobal:\n\n extern rt_camera * get_camera(struct rt_pack * pk ); \n\n\n\n\n\noct 19\n---\n\nNew rt_pack export: \n\n\n \/\/\n \/\/ this returns true if any wheels are in contact.\n \/\/ always returns false for packs that do not have wheels\n \/\/\n __inertia_export bool are_wheels_in_contact() const;\n\n(melina)\n---\nphyiscs optimizations on, so it should run faster\n(daniel)\n---\n\n\noct 18\n---\n\naccelerators emulated\nplease let me know if you see cases in which they don't work\n\n(rich)\n---\nquirk fyi:\n\n if you spawn a pack from host startup messages, its position will be relative to the player\n as the player is passed as the link ob. To avoid this, add a delay of 0.125 and the message\n will loose its link object and spawn in global coordinates.\n\n\n \n---\n\nfirst pass on dw_tornado\n\n---\n\n\n\n\n\noct 17\n---\n\nNew for ed_mesh:\nfilter()\n\ndoes the following:\n{\n undo_frame __frame(\"filter\");\n\n combine_equal_verts(this);\n remove_degen_faces(this);\n combine_textures(this);\n filter_surfaces(this);\n remove_degen_faces(this);\n remove_unused_verts(this);\n}\n\n\nFilter surfaces is new, it will combine surfaces that have the exact same list of textures.\nOccasionally textures will be unique because color values are slightly different, this could be avoiced\nif possible.\n\ne.g. \n surface_0 and surface_1 use the same image.\n\n\n surface_0 has diffuse of 0.5 0.5 0.51\n surface_1 has diffuse of 0.5 0.5 0.5\n\n solution: clamp values\n\n---\n\nIf you move a local file into a new directory and start mod, it will automatically remove the file on shared\nwith the same name but having the old directory. It will claim that the file is obsolete.\n\nThis is to prevent the name comflicts that occur when moving batches and packs between directories\n\n---\nFirst pass on dw_lightning_cloud and \n dw_buzz_saw\n\nSource is updated, batches are on S:\\w\\david!\\batch\\weapons\n\n---\n\n\n\n\noct 16\n---\n\n new flag for pack:\n\n is_racer\n\nThis should be set for all packs that may participate in a race \n(e.g. cars)\nThis will be used to filtering targets and race_experts enumerating\nparticipants \n\n---\n\n flag used for back: can_be_sliced\n \n Packs should set this if they want to be sliced in half by the buzzsaw\n \n packs that get sliced MUST have a cld hull as their collision rep\n\n\n\n---\n\nimproved path planning, it was failing in a number of cases \nthat were not exposed by rh_pit_race (or worked around by clever designers)\n\n\n---\n\n Changed race_expert to cure problems that would arise when the AI\n planned a backward path (most common in short races with <= 5 check points)\n and in races where ais started in random spots rather than the start like.\n\n The set_next_check_point only tracks one check point ahead if the racer is on the path that she should\n be on and (p.position.path_position > 32768) (which in fixed point notation is 0.5.\n\n So if the ai is on track and more than halfway along its current path, she will plan to the\n end check point of the NEXT path, otherwise she will plan for the end check point of the current path.\n \nRich\n----\n\nNew pack exports:\n\n\n \/\/\n \/\/ returns our closest target, if any\n \/\/ 0 if there is no target\n \/\/\n __inertia_export rt_pack * get_target() const;\n \n \/\/\n \/\/ returns the point on this pack that should be targeted, \n \/\/ usually close to the center of mass.\n \/\/\n __inertia_export vec3f get_point_on_me_to_target() const;\n\n\nNew level export:\n\n\n \/\/\n \/\/ enumerates all objects in the world with is_racer set\n \/\/\n __inertia_export void enumerate_all_racers( darray_buf_ls<rt_pack*> * p_result );\n\n\n\t(e.g. g_level.enumerate_all_racers() )\n\n----\n \n\n\n\n\noct 14\n---\n\n\n fixed crash on tile road sections\n\n (rex, dan)\n\n\n---\n\n 'Q' will self destruct your car.\n you may have to hold it for about 1\/2 second\n\n\n\noct 12\n---\n\n\nSpawn\/Respawn:\n\n Packs with a planner in them (an AI or a Player) will store respawn points that are used of they are destroyed.\n If a pack has a respawn point set and it is destroyed, it will be recreated 3 sec at its last set spawn point.\n\n\n Use this to destroy a pack:\n\n \/\/\n \/\/ destroys the pack, if it has a spawn point set it will reappear at that point\n \/\/\n __inertia_export void __fastcall self_destruct( u32 reserved =0);\n \n Use to set\/get spawn point:\n \n \/\/\n \/\/ write the spawn point to this pack.\n \/\/ If there is no planner in the pack it will not be registered, and false will\n \/\/ be returned.\n \/\/ Otherwise the planner will store it and return true;\n \/\/\n __inertia_export bool set_spawn_point(const basisf_q & m_lb);\n \/\/\n \/\/ reads the spawn point from this pack.\n \/\/ If there is no planner in the pack it will set the result to the identity and return false\n \/\/ Otherwise it will return the value stored by the planner\n \/\/\n __inertia_export bool get_spawn_point(basisf_q * p_result);\n \n\n\n\n When player is created its spawn point is set to the start position. Race experts should update the spawn point\n as cars pass check points\n\n---\n new for ef_check_point\n\n b_disable_spawn)\n\/\/? If this is set, the check point will not be used as a spawn\n\/\/? point. (e.g. for check points above jumps)\n\/\/? Note: the race expert must respect this flag when overwriting \n\/\/? spawn points\n\n---\n\n race_expert.cpp has been updated to set spawn points;\n\n Spawn position is updated when:\n\n Any car passes a check point with b_disable_spawn not set\n\n A car is added to the race\n\n\n race_expert dispatches l1 and l0_passed messages when you a car passes a check point \n (I should have done this before)\n\n race_expert only removes packs that are closed, not just inactive packs.\n when packs are destroyed, they are temporarilty inactive until they are respawned, the race should not \n loose track of them.\n\n\n---\n\n\napi change:\n\n You should no longer access the material of a cld prim directly, as this may change if the prim is re-used\n (for example, height fields)\n \n for collision_message\n\n use: \n\n\n msg->material_other\n instead of \n msg->p_other->material_id\n\n msg->material_me\n instead of \n msg->p_me->material_id\n\n\n---\n\nnew psc op:\n\nopen \"name\"\n\n\"name\" can be a batch or a level\n\neasy way to find a file without opening filters\n\ne.g. open \"dw_pit_race8\"\n\n----\n\nnew psc op:\n\nupdate \"name\"\n\n\"name\" can be a batch or a level\n\ne.g. update \"dw_pit_race8\"\n\n\nnew command:\n \n file->update_all()\n\nThis will execute the psc script update_all.psc\nthere is a sample on S:\\w\\update_all.psc that contains what is needed for the m1 drop\n\n\n In order to us update_all, update_all.psc MUST be in the mayhem root dir\n update_all calls the psc op (you could type it in) execute_psc \"update_all\"\n\n(rex)\n\n---\n\nexported two new functions for packs:\n\n \/*\n \n Applys a dent to a pack\n A dented mesh can still drive\n\n *\/\n __inertia_export bool apply_dent( \n const vec3f & _cld_point, \/\/ point at which dent occured in local coordinates\n \/\/ e.g 0, 0, 1 is above pack and will apply a dent downwards\n \/\/ 1, 0, 0 will dent from behind\n float duration, \/\/ how long to remained dented\n float distance ); \/\/ scales the amount that verts move from the dent\n \/\/ usually in the range 0..4\n\n\n \/*\n \n Flattens a pack\n A flattened pack cannot do anything, \n it just topples arround\n\n *\/\n __inertia_export bool apply_flatten( \n int axis_0, \/\/ axis along which to flatten\n \/\/ 0 is from the front or back\n \/\/ 1 is from the side\n \/\/ 2 is from the top or bottom\n float duration); \/\/ after the pack comes to rest it will wait this long on the ground\n \/\/ before popping back up\n\n \/*\n \n Removes all child packs on weapon mounts\n this its usually called before apply_flatten \n (if you want the player to loose her current power ups)\n\n *\/\n __inertia_export int drop_pickups(); \n\n(daniel)\n---\n\n\n\noct 11\n---\n\n\n\ncollision sound tuning\/tweaking (change to exes)\n\n---\n\nSmoosh handler has been updated with new volume settings\n\n\n---\n\nobjects cannot have coordinates outside of 1023.\nthey will automatically get clampped\n---\n\nsmoosh_handler updated to support collision sounds\n\nplease update from dw_smoosh_handler. \n (you may want to remove the func from your level's pack and add the dw_smoosh_handler pack)\n\n---\n\nBoxing gloves reimported from dp_boxing_gloves\nsounds added to weapon_boxer \nsounds added in mod to dw_boxing_gloves\n\n---\n\nsounds added to weapon_hammer \nsounds added in mod to dw_hammer\n\n---\n\nsound playback functionality added to bridge turner (actual sound must be dragged in as I don't own the pack)\n\n\n---\n\nskid sound in flight fixed\n\n---\n\nsound action items:\n\n\n (rich) please drag bridge_spin.wav into rh_bridge->turner \n\t\tplease set range to 64,128\n\n\n (daniel) please set skid and engine ranges to 8,16\n\n (daniel) please removed the engine sound temp from dp_spy_car\n\t\t \n\t\t the sound should be in the rtf_car functional\n\n\n\nThe following entries need to be bound in mod:\n use a tab stop of 24 to view.\n fGain is the setting for the waves volume\n TB3DSINGLE must be set to 3d\n TB2DSINGLE must be set to 2d \n\n\n iPID\t1 - pszName\t2 - cType\t3 - fGain\t4 - pszWave\t5 - bStream\t6 - bHide\t7 - cRnd\t8 - Loop[0]\t9 - Loop[1]\t10 - MinDist\t11 - MaxDist\t12 - bRndStart\n\n\n\nF launch bouncyball\tTB3DSINGLE\t0.4\tlaunch_bouncy\t\t\t\t-1\t\t16\t\t\n\n\nR weight drop\tTB3DSINGLE\t0.25\tweight_drop\t\t\t\t-1\t\t16\t\nR swinging hammer whack\tTB3DSINGLE\t0.4\tswinger_whack\t\t\t\t-1\t\t16\t64\nR crate destroyed\tTB3DSINGLE\t0.4\tcrate_destroyed\t\t\t\t-1\t\t16\t\nR race start\tTB2DSINGLE\t0.55\trace_start\t\t\t\t-1\t\t\t\n\n? cooked by lava\tTB2DSINGLE\t0.4\tlavadeath\t\t\t\t-1\t\t\t\n? cha-ching\tTB3DSINGLE\t0.6\tchaching\t\t\t\t-1\t\t16\t\t\n\n\n \n\noct 10.5\n---\nrtf_car has two new members:\n\n engine sound\n skid sound\n exported dw_spy_car_blue with sounds set up. You can copy these\n (the signal binding must stay, the wafves can change)\n\n you currenlty need my smoosh handler to hear certain side effect sounds (e.g. brake)\n\n\n\noct 10\n---\n\nThe driving surface for a road must be a rectangle (4 points only)\n\n To create the driving surface please use something like the following procudre:\n\n call make_rect()\n set the hull scale to 32 16 1\t (64 meters long, 32 wide)\n set flat to true\n set extrude radius to about 0.125\n set the hulls position to 0 0 -0.125 ( -extrude_radius )\n\n---\n\n\nThere are occasional data synch problems with shared data for road sections.\n\nCurrent workaround:\nIf you notice data not being propagated (e.g. collision mode),close your level\nopen the road section, set the data and reopen the level\n\n\n---\n\n\nWhen you update your dll's please update your .pdbs are well, thanks.\nalternative you can change your \"C++ option\" \"debug info\" from \tprogram data base to c7 compatible, in which case\ndebug info will be put in the dll.\n\n---\n\n\nupdated comment in header file:\n\n \/\/\n \/\/ This will returns 0 if the pack is not able to deform (deform flag is not set)\n \/\/ Otherwise it will create a ffd if none exists or return an existing ffd for this pack\n \/\/ do not cache an ffd pointer between frames\n \/\/\nstatic pack_warper_ffd * get( rt_pack * pk );\n\n(Dan)\n\n---\n\nbug fix: when 2 unmovable objects collided there would be a divde by zero.\n\n(Dan)\n\n---\n\nNew tool on mouse right click menu:\n\nmake check point\n\/\/? make check points:\n\/\/? works well with the grid visible and \"disable height field\" set to true\n\nhelp:\nb_join_points\n\/\/? If this is set any check point made will be connected to \"last_check_point\"\n\/\/? last check point will be set to this new check point\n\nlast_check_point\n\/\/? Be careful about replacing a check point in this box, if you drag a check point\n\/\/? onto another check point it will connect them with a path, you have to drag the \n\/\/? new check point to somewhere just at the very bottom of the box where the current \n\/\/? point in the box does not become highlighted\n\npack\n\/\/? This is the pack into which check points will be put. if last checkpoint is set, this \n\/\/? is not needed\n\n\n\n---\n\nFixed a potential FPU divide by 0 bug in AI targeting.\n\n\n(daniel)\n---\n\nWhen you drag a pack that is attached to a road, it would recompute its position in road\ncoordinates.\nTo move a pack relative to a road, use the road_gb directly. (e.g. sliding along X will moving it along the road,\nz is up and down, +y is left relative to the road)\n\n---\n\nnew for ed_patch:\n\nb_use_default_material\n\/\/? If this is true, the material set in the height field is used.\n\/\/? Otherwise a custom material may be assigned\n\nmaterial_id\ncustom material, only used oif use_default_material is false\n\n\n--\n\nyou will need to delete rtd.\n\n--\n\n\n\noct 11\n---\n\nWhen you get mod and war, please copy mod2k.pdb and war.pdb as well (same dir) \n\nWhen we make builds of war, please include war.pdb in the war dir.\n\n\noct 10\n---\n\nNew: \"Replace Pack\"\n\nDrag a pack or a batch onto a pack in a level and it will be replaced.\n(you can also drag a .dwb from windows, as long as it has 1 root pack)\n\n\nThe following occurs:\n\n \"old\" is the pack that was in the level\n \"new\" is the pack that has been dragged into the level\n\n old l0 data is copied to new (position, road_id info, etc)\n each func in old tries to find a match in new. A match is a func with the same name and class\n if a match is found, l0 data is copyed from the old func to the new func.\n (this will copy outgoing l0 messages)\n \n All references to old and old's funcs are remapped to the corresponding new and new's func\n \n e.g. a message in host startup messages sent to an old func will be redirected to the new func if a match was\n found. \n\n---\n\nSupport For Themes:\n\n Themed packs must use the following nameing convention:\n \n INITIALS_THEME_PACKID_whatever\n\n\ne.g. dw_hell_dude_00\n\n\t There MUST be a _ before theme and a _ after pack_id\n\t \n\te.g. dw_hell_dude00 is not valid\n\n\n\nIf the theme were changed to farm, the pack would look for:\n\n\n *_farm_dude_*.dwb\n\n\t There should only be one batch with a matching mid section\t(theme and pack id)\n\nnote note note:\tEach theme pack must be owned by a batch with a name that \"matches\" the packs\nby matches, I mean that the middle two sections are equal\n\nall comparisons are case sensitive, make all theme and packid names lower case\n\npackids must be aggreed on by designers\n\nTheme packs should that require remaps must have funcs with the same name.\n\ne.g. if farm_dude has a timer called \"pulse_me\" that gets pulsed, hell_dude should have a timer\ncalled \"pulse_me\", that way if farm_dude->pulse_me has incoming messages, they will be redirected to\nhell_dude->pulse_me\n \n\nEach level stores its current theme. (in a drop box)\nWhen you change the theme, all theme packs will search for replacements based on the new theme.\n\nHere is a partial list of theme names, as this list changes it will be updated in the drop\nbox of levels, please refer to this for an up to date list \n\nfarm\nhell\ndessert\ntran (transylvania)\njungle\nspace\n\n\n\n---\n\nNew members for edit options:\n\npack_view_filters[0]\n\/\/? If this is not set to \"misc\" only packs fo this class will\n\/\/? be displayed in the level's tree view\n\/\/? (you can always view all of the levels packs by exlicitly opening\n\/\/? the level's \"packs\" folder\n\/\/? This filter applies to level tree view\n\npack_view_filters[1]\n\/\/? filter for packs in right center property window\n\npack_view_filters[2]\n\/\/? filter for packs in bottom center property window\n\npack_view_filters[3]\n\/\/? filter for packs in bottom right property window\n\n\n---\n\nMorphed Meshes use the following system:\n\n A pack has a morph_input_signal, if this is set to anything other than \"none\"\n the pack is a morph pack.\n \n A pack stores a series of Meshs, each representing the mesh at a given point in time\n This list takes the place of the LOD list for meshes, morph Meshes cannot have LODs (this may be added later)\n \n A morph mesh will display a mesh based on the value for the specified signal.\n\n If there are 32 morph meshes, \n\n signal == 0 will select mesh 0\n signal == 0.5 will select mesh 16\n signal == 1.0 will select mesh 31\n\n Signal values are wrapped, so 2.5 == 1.5\n\n If a morph has a duration of 4 seconds, you can set the signal to time*0.25\n (note, you will have to offset this value if you want it to start at a specific time rather than continiously \n looping)\n\n The max exportor is used to create morphed meshes, set the sample frame rate to something appropriate\n (more samples looks better but uses more memory)\n\n see dw_bend0 for an example\n\n---\n\nNew for ef_key_frame:\n\nremove_useless_keys\n\n\/\/? This should be called at least once on all imported animations\n\/\/? removes all keys that apply no transformation\n\/\/? (keys that have no effect)\n\n---\n\nTip for running Max and Mod without reboots in 98:\n\n always close msdev before running Max\n always close mod before running Max and vice versa\n pray and save often\n\n\n\n---\n\n\n\n\n\n\noct 9\n---\n\nrectangular textures will be loaded and resized as appropriate.\n\n---\n\nwindow layout changed.\n\nIn all of the object \"Tree\" views you can drag objects into the empty space to show a tree\nview of that object\nRight click drag will allow you to \"append\"\tor \"replace\".\n\nShift->click creates a prop window at the bottom center of the screen\ncontrol->click creates a prop window at the bottom left corner of the screen\n\n---\n\nPack class names updated\n\n\"Misc\", \n\"World\",\n\"Road\",\n\"Decoration\",\n\"Light\",\n\"Gag\",\n\"Car\",\n\"Virtual\",\n\"Power Up\",\n\"Rubbish\",\n\t\t\t \nThere is a new \"hot_keys.txt\" that has these bound to the tool bar in S:\\w\n---\n\n---\n\n\n\noct 8\n---\n\n\t\t\t\t\t\t\t\t\t\t\t \nfunc tree views are now sorted alphabetically\n---\n\nnew func for check points: update_names\n\n---\n\nYou can now select and transform check points doing this:\n\nwatch the pack containing the check points\nselect the check points (if you use \"select\", make sure to turn on the \"components\" check box\nUse \"Move Selected\" \n\n---\n\nCheck points now draw a line that extends to z == 0\nto view heights for check points, disable draws on terrain, roads etc and draw_check_points\n\n(rich)\n\n---\n\nNew flag for ef_height_field: auto_update\n\nIf this is set, the terrain will auto update when check points are moved around\n\n\n---\n\nYou can now explictly set the dimensions for your height fields. \nWrite numbers to patch_dim[0] and patch_dim[1]\n\n(rich)\n---\n\n\nNew flag for view: draw_orgin\n\n(rich)\n---\n\nyou may get a message telling you to update your video drivers\n\n---\n\nGos now lets you set text alignment\/justification (Rich's request and Andy got it in)\n\t \n\t ?gos_TextSetAttributes@@YGXPAU_FontInfo@@KM_N111K@Z\n\n\n(rich)\n\n\noct 8\n---\n\n\npaths:\n\n compute lengths and align sections have been replaced with \"tile sections\"\n \n If you call this on a road the following occurs:\n\n The length of the path is computed (all paths with the same road_id up to the next road_start )\n This number is rounded to the nearest multiple of 64\n Road sections are aligned starting from the beginning.\n if there are too many sections (e.g. 3 64 m sections when the length is 128) extras are removed\n if there are too few sections, the last section is duplicated until the road is full.\n\n\n--\n\nNew flags in view->options: disable terrain, toggles draw terrain on off\nthis can also be set with the psc ops (disable_terrain 1 )\n(rich)\n---\n\n\noct 6\n----\n\nnew for l1_ef_height field:\n \n road_z_offset, default -1\n this adds a bias to terrain, shifting all hights by this amount relative to the check point loop.\n Make sure to set the radius of check points accordingly. (eg. 16 for a 32 meter wide road like the bridge)\n\n\n---\n\nLock down for paths:\n\n Previously all roads were defined but a series of paths with the same road_id, and the first path marked\n as b_road_start\n\n Now road \"sections\" have a road id and a \"stop_id\". The stop_id is computed automatically by the number of \n road_starts that take place on a path.\n \n For example, say you have four sections joined together to form a loop.\n \n path 0->1 is marked as road_start, it will have road_id == 1, stop_id == 1\n path 1->2 is not marked, it has road_id ==1, stop_id ==0;\n path 2->3 is marked as road_start, it will have road_id == 1, stop_id == 2\n path 3->0 is not marked, it will have road_id == 1, stop_id == 2\n\n Each pack stores a road_id and a stop_id\n dragging a pack onto a path will assign it the appropriate road_id\n\n\n Example: 4 paths, path 1->2 is a bridge that you want to put a 64m mesh across:\n\n path 0->1 is not set as a road_start\n path 1->2 is marked as a road_start (it is the bridge)\n path 1->2 has a rest length of 64m and quantize is turned off\n path 2->3 is a road_start too\n path 3->0 is not a road_start.\n\n That way you have a road starting at the end of the bridge and ending at the bridge, and another\n road which is only the bridge.\n\n \n road starts draw in green\n normal paths draw in grey\n selected paths draw in red \n\n(design)\n--- \n\n warped packs will deform their shadow rep\n\n\n(design)\n---\n\n Grid is now drawn using a dp_big_grid pack.\n It is drawn at z ==0 and extents +- 512 in x,y\n\n\n(design)\n---\n\n\n\n\noct 1\n----\n\n\nNew class: ed_sound:\n\n\n\/*?\n\n A sound, one of three types:\n\n 2d: 2d sounds are played at full volume without panning.\n they are only played if the location at which they are is\n within the range\n set the range to 1e6,1e7 if you do not want them localized\n Many cartoon effects that happen at specific locations can use this play mode as \n they should only be heard if the player is close, but they are not really\n 3d sounds\n\n \n 3d: Standard 3d sound\n\n \n Music: only one music can be playing at any time.\n playing another music will stop the first\n Music is always heard no matter where the player is\n\n\n Dragging a wav will create a 2d or 3d sound\n Dragging an asf or mp3 will create a music. asf is preferred as it\n is more efficient in terms of processing and space. At a given bit rate\n the quality is usually higher than mp3.\n\n\n Ways to play sound:\n\n Open Loop Playback:\n\n edm_play_sound: A simple sound once, if sent to global it will be played at the origin\n if sent to an rt_func it will be played where the functional is\n Dragging a wav onto a message batch will create an edm_play_sound\n\n \n ef_custom: declare a sound_ptr member (e.g. sound_ptr m_sound) and call m_sound->play();\n\n \n\n Feedback:\n\n ef_sound: Turning it on will start the sound, turning it off will end it.\n These sounds update their positions and velocities over time\n They can also update volume if a signal is set up\n\n*\/\n\n\nstring,name)\n\/\/? file name of sound\n\nfloat,volume.v)\n\/\/? volume for playback\n\nfloat,base_priority)\n\/\/? base priority, when there are too many sounds playing, the lowest \n\/\/? priority sounds are dropped\n\/\/? priority is calculated as:\n\/\/? volume * base_priority * distance_modifier*(1 - completion_ratio )\n\/\/? distance modifier is 1 when distance from player to sound is <= range[0]\n\/\/? it drops linearly to 0 when distance from player to sound is >= range[1]\n\/\/? completeion ration is how far along the sound is, 0 means just started (or looping)\n\/\/? 1 means finished\n\n\nfloat,reverb_gain)\n\/\/? gain applied to reverb, 0 is no reverb\n\nbool b_is_looped)\n\/\/? if set, the sound will play continuously, otherwise it will stop after one playback\n\nbool apply_doppler)\n\/\/? wheter or not doppler should be applied\n\nbool is_streamed)\n\/\/? A streamed wave will not be loaded immediated, this is for very big waves\n\n\nvec2f,range)\n\/\/? range from which this sound is audiable\n\/\/? if distance <= range[0], sound is at full volume\n\/\/? if distance >= range[1], sound is silent\n\n\n\nSept 30\n---\n\nChanges to the API for gameos:\n\n Fonts must be done though game os. see gameos.hpp for an example\n DrawSprite,line,etc use an exlicit blend mode rather than implicitly setting it in the color.\n\n For solid colors, always set alpha to 255.\n e.g. red is rgba(255,0,0,255)\n\n\n\n\nsep 20\n----\n\n when modifying a path, the road_length will not change until you call \"compute_road_length\" on the path\n This prevents the poping that you get when deforming a road.\n after calling compute_road_length you may need to add \/remove road sections as appropriate\n\n---\n\n\n - objects stuck to splines now store an oritention in addition to a position\n - When you drag a non-warp object onto a path, it will compute a the orientation and position s.t. the\n object is not initially moved (from this point on, it will move with the road)\n \n - The easiest way to move one of these objects is to click on the pack. non-shared - misc will have a path_gb\n you can use the arrows, and sliders to move the pack.\n - +x moves the pack forward along the road\n - +y moves the pack to the left on the road\n - +z move the pack up relative to the road\n\n\n\n\nsep 19\n----\n\n\nchanged everything.\n\n- use generate_lods on a pack to generate lods\n\n----\n\n\nCertain coordinate schemes have chanaged. When you open a mesh with dofs you will likely find\nthat dofs are out of place\n\ncall pack->other->upgrade_positions and everything should be fixed.\n\nNote: if the dofs of a child pack are incorrect and you open the parent, the child will not update its mesh on\nupgrade_positions()\nYou will need to open the pack as a root;\n\t\t\t\t s\n----\n\n\nThere is a file called max_to_mod.dle that when dropped into a Max plugin dir will allow you\nto export .dwe files.\ndwe files can be dragged directly into mod and will create packs\n\n---\n\nExported new functions for frame:\n\nvoid frame::set_frozen();\nvoid frame::clear_frozen();\n\nEvery call to set_frozen should be matched with one call to clear_frozen\n\ne.g. set_frozen(p_frame );\nwait 10 seconds \n \n clear_frozen( p_frame );\n\n\n(rex)\n---\n\nMinor improves to camera and driving on spline paths, please see dwtracktest\n\n\n----\n\nNew flag for cld hull: flat\n\nIf this is set, and the hull is a quad, it will be stretched along the spline.\nThis is the ideal setting for a road surface. \nUse make_rect, set extrude radius to something like .125 (larger numbers will work too\nMake sure that the Z axis is up and the X axis is forward.\n\nsee dwtracktest.dwl for an example\n\nThe road and sides of the road are marked as flat.\n\n----\n\n\n\nSpline assisted Level Creation:\n---\n\n\n Goal: [inappropriate remark removed]\n \n\n\nRoad Sections:\n--------------\n \n These are used to construct the primary driving surface\n \n Making a Road Section:\n \n Solicit Mesh from Artist\n\tMake a pack out of this \n\t\n\tRoad should travel in X, up is Z, left is Y\n\n\tZ == 0 should be the height at which you can drive\n\t\n\tSet the meshes road_section length.\n\tThis should be a multiple of 16.\n\t\n\tThe length is the total span of the Mesh along X. The support verts in X should be at\n\t \n\t [ -road_section\/2, y,z ] , [ road_section\/2, y,z ]\t \n \t\n\n\tCollision rep:\n\t \n\t Only hulls can be used\n\t These should be Rects (make_rect) or boxes (make_box)\n\t These will be tesselated as needed\n\n \n \n\tshared -> warp_to_road: this should be set for road pieces, it will cause the mesh to deform based on the\n\t\t\t\t\t\t\t road spline\n\n\tshared -> tesselate_mesh: This should be set for road pieces with minimum verts, verts will automatically be \n\t\t\t\t\t\t\t inserted based on the curvature of the patch\n\t\t\t\t\t\t\t Certain Road pieces (bridge) are already tesselated, and do not need this option\n\n\n\tl0->road_id: Index of road in which this is embedded, 0 for none.\n\t This is set automatically in most cases (see Building a Race)\n\n\tl0->road_c: Position of Pack on Road. X is distance along spline from start to the cofm of the pack\n\t\t\t\t\t\t\t\t\t\t\t Y is horizontal offset, Z is vertical offset (both are usually 0)\n\t\t\t\t This is set automatically in most cases (see Building a Race)\n\n\n\n\tFor an example: see dwtracktest.dwl\n\t \n\t dwBridge1\t(pretesselated)\n\t dw_brick_barrier (tesselated by spline)\n\n\n\n\nBuilding a Race:\n\nStep 1: Construct splined Path:\n\n\n\tCreate three check points \n\tdrag them onto each other sequentially to create paths\n\tmark each path as road_id == 1 (1 is main race)\n\t\n\tset road_start == true in the first path\n\n\tDrag around points and use \"split\" on the path to add control points, \"remove\" on check points\n\tto remove them\n\n\nStep 2:\t Apply road sections\n\n Drag and drop road sections onto the Road Path until it is full.\n Dropping a pack onto a road will:\n Append pack at the empty of the current road\n\tSet the packs road_id\n\tset the packs road_c\n\n Draging a road pack onto another road pack will allow you to replace the road\n section with a new one (e.g. replace a brick road with a bridge)\n \n Alternatively, you chould remove the original piece, and copy in a new pack, setting its road_c and road_id to\n that of the previous pack\n\n\nStep 2:\t Apply road scenery\n\n\n Drag non road packs onto path\n \n path_c combined with the road spline will determine the position and orientation of the object\n in order to move the pack, you must set path_c rather than gb.c\n\n When the path is moved, scenery will be moved to follow\n\n \n (e.g. rh_hammer in dwtesttrack)\n\n\n\n\n\nTodo:\n \n - Collision detection is not good for driving on hulls\n - Camera has problems\n\n - Improve scenery positioning interface, allow for orientation and easily setting path_c\n \n\n\n\n---\n\n\n\n\n\n---\nnew message: edm_set_scalar\n\n can be used to set signal registers in packs\n packs maintain the last signal written to them \n\n all signals start out at 0\n(sonya)\n---\n\n\nMon sept 9\n---\n\n\nnote: rtm_custom has not yet been tested\n\nnote: path_location::get_only_race()\n\n\n---\n\nNew message added: rtm_custom\n\n This is used for sending custom events locally and across the net.\n see race_expert for an example implementation that uses an rtm_custom to synchronize race positions and \n participant lists\n\n(Rich)\n\n---\n \n\nnew flag in psc: disable_read_only 1\nuse this only for testing purposes\nit will allow you to change data owned by other people\nuse sparingly\n\n---\n\nFont problems fixed \n\n\n(Rich)\n---\n\nnew function: \n\n path_location::get_only_race\n \n just like \tpath_location::get\n \n but filters for race paths only\n\n\n(Rich)\n---\n\n\n\nsept 8\n\n---\n\nif you add profile 1 to your psc and press tab-F4 you will get a better breakdown of where time is going\n\n note: in mod2k (but not in war) two important overview categories are missing (draw and step)\n\n---\n\n\nFor future builds you should use: back_buffers 2 on most cards (as long as the card is not short of video memory)\n\n\n--\nrecommended setting for damage to dent_scale in smoosh_handler: 6.00\n\n---\n\n\nadded hooks for tbid_mallet_trigger\n\t\t\t\t tbid_mallet_miss\n---\n\nremote objects that you flatten that think they have not been flattened will stay flat and be allowed to drive\nrather than popping right back up\n\n---\n\nDent scales and such changed\n\n---\n\nBirds only appear when damage > bird_damage_scale\n\n This can be set in the smoosh handler (default is .6)\n\n---\n\n\nun flatten plays proper sound\n\n---\n\n\nNew for rt_func: apply_warp_to_gc\n\n\/\/? If this is set, a warp will be applied to the global coordindates of this if\n\/\/? the pack is currently warped (e.g. sloshing around)\n\/\/? useful for things like particle emitters that should be pegged to a mesh\n\n\n---\n\n sloshing of car when stunned\n\n---\n\n birds and stars appear on more smooshes\n \n---\n\n3 smoosh level thresholds\n\n\n---\nef timer:\n\n\/\/? supported messages:\n\/\/? set_switch->pulse()\n\/\/? dispatches messages\n\/\/? Link position is location at which func is located\n\/\/? link object is the source link object if the message was a pulse, the frame in which the timer\n\/\/? is located otherwise \n\n\n(rich)\n---\nFor 3d sounds, the position at which the sound is played is as follows:\n if the message is sent to an rt_func, it is played at the funcs location\n if the message is sent to pie, it is played at the link objects position (delay must be 0 )\n\n(rich)\n---\n\ndamage needed to smoosh should be set to 0.25\nin smoosh handler\n\n(rich)\n\n---\nnew for level: remote_object_created_flags\n\n\tusing this you can pulse your race expert and add the object to your race\n\tif the object is a vehicle.\n\n\tNote: your race expert must be able to elegantly handle remote objects disappearing and then reappearing\n\t\n\tWhen a pack changes, the pack that you are storing will become inactive and a new pack will be created.\n\tsimply removing inactive packs and adding then as needed will handle this to some degree, but will not work in the \n\tfollowing cases:\n\n\t - a remote object is no longer present in the world because it is too far from you to notify you of its existance \n\t (and waste your bandwidth)\n\t\n\t - messages indicating that a racer is gone may not be appropriate if the object is being replaced (and was not destroyed)\n\n\n---\n\nyou must delete rtd\n\n---\nFix\n\n\n Bird and star\n - duration lengthened\n \n - root orientation stays in aliged with the global bases\n\t\n---\n\nPossible Fix (need to test)\n\n hammer staying visible\n \n---\n\nPossible Fix (need to test)\n\n driving while flattened\n \n---\n\nnew flag for l1_ef_pack:\n\n simulate_if_virtual\n \n if set the object will simulate (let dofs move) even if virtual (it will not do collision detection)\n\n This is used for dw_stars and birds which is marked as virtual but still simulates so that the revolutes birds roate\n\n---\nnew flag for pack: b_is_disabled\nthis will be set when the pack is stunned\n\n---\n\nNetwork runs some what decently on high latency or low bandwidth\n\n---\n\nanything that is out of synch by > 8 meters is teleproted\n\n---\n\nchanged network update settings\nanything that is out of synch by > 4 meters is teleproted\n\n\n---\n\n\ndecreased ks,kd when camera is stunned\n\n---\n\n\nadded calls for reflate sound and stunned sound\n\n\n---\n\ndraw race track on radar only draws paths marked as race\n\nrace track thickness can be set with \"radar_track_thickness\"\n\t\t\t\t\t\t\t\t\t \ndefault is 4 pixels (was 2)\n\n---\n\n removed message in hammer that played sound\n\n---\n\n removed connection button from multi player screen\n \n---\n\n changed hammer material from swinging hammer to pickup hammer for proper sound id\n\n\n---\n\n fix for cards with only 1 texture state (banshee)\n---\n\n\nflatten from sides and front makes you completely flatt.\n\n\nsetting \"net_tcpip 1\" in war.psc will connect you to tcpip\n\nnote: this will form the net connection before war is initialized. If you are playing single player\nyou will have a net connection that does nothing.\nordinarily the connection is only made if you press \"multi player\"\n\nnet_tpcip 1 worked on my machines. We should use this in all future net builds\n(possible a batch file with more than 1 .psc so that single player does not auto connect.\n\n\n\n\nsept 1\n---\n\n---\n\ntbsetcarweelspeed now passes 0 for acceleration and thrust for thrust\n\n(thrust is 1 when full forward is pressed, \n 0 if nothing is pressed\n -1 if full reverse is pressed)\n\nacc is not yet set because it is unavailble.\n\ntbsetplayerskid is supported\n\ntbstart\/stop engine supported\n\n\n---\n\nnew for pickup:\n\n pid\n\n if this is set and auto mount is set, the pid is loaded and mounted\n\n(daniel)\n\n\naug 31\n---\ncar with pitch in flight if you use forward or reverse.\nflight_pitch_kd 0 to zero\n\n\naug 30\n---\n\n\n\n---\n\nnote: In order for the camera to consider something drivable, you need to give it collision mode == world.\nThis is why in many levels, the camera thinks the car is out of control.\n\n\n\n---\n\nnew state: ef_state_attack\n\nsee dw_bounder2 for example\ntry playing him into 6the sim options player and run dwMPtest\n\n---\n\nset_state w link ob fixed (I hope)\n\n(rich)\n---\n\nrace expert accepts the command->start message\nthis will add all controlled packs to the race\n\n\n---\n\neditor_config->b_tv_paths\n\n\/\/? if set, paths are drawn in the tree view of packs\n\n\neditor_config->b_tv_check_points\n\n\/\/? if set, check_points are drawn in the tree view of packs\n\n\naug 29\n---\n\nAccelerate, brake and slide sounds are played by the smoosh_handler.\n\n\n---\n\nBridge implementation\/changes:\n\n removed signals from pack\n \n added a bridge_turner functional (See bridge_turner.cpp)\n this functional gets turned on by the target, it will automatically turn itself off\n\n added a camera_stunner functional (See camera_stunner.cpp)\n this stuns the camera when the user is on the bridge\n\n \n \n see dw_pit_race0.dwl\n\n\n---\n\nweapon hammer.cpp updated\n\n when not in use:\n - the hammer is shrunk to a small size\n - collisions for the hammer are disabled.\n\n\n---\n\nnew event: car slide\n\nplayed when a car starts into a slide\n\n---\nnew collision mode:\t world\n\n\nnone collides with nothing\nparticle do not collide with one another\nworld do not collide with one another\n\n none particle world normal\nnone no no no no\nparticle no no yes yes\nworld no yes no yes\nnormal no yes yes yes\n\n\naug 28\n---\n\ndriving model updates\n\n---\n\nnew flag for sensors: only_vehicles\n\n--- \n\ntexture generate fixes (filtered a few bad cases)\n\n---\n\n event hooks added for accelleate, turn and brake. \n These should dispatch sounds and such\n\n---\n\nupdate_listener is called by a \"wheel speed\" of car.\n\n- When on the ground and brakes are not applied, this is the speed of the car\n- When in flight, speed slowly decays over time. If thrust is pressed, speed increases\n- Whenever brakes are applied ( > 0.5 ), speed will be 0. (visually, wheels will freeze)\n\n(Andrew)\n---\n\nSound is played by directly invoking tbapi\n\n\\sound\\tbiapi\\*.h is where the header files are stored\n\\w\\tbapi.lib must be included into your project to use tbapi\n\\sound\\tb_coordinator.h is a few helpful things \n(sound id enumeration and vector conversion)\n\n\nsee david\\weapon_hammer.cpp for an example. (plays a single shot sound when you use the hammer)\n\nCurrently I hear no sound. This may be my fault.\n\n---\n\nHight field texturing:\n\n drag a texture onto the height field for road_texture\n drag a texture onto the height field for grass_texture\n \n specify a texture_name: e.g. 'yadda' \twill create yadda_GGG, Yadda_GGSG, etc.\n\n specify a mask_name: e.g. 'mask' \t(default is on shared, mask_*.bmp, you can edit this to create \n wavey images and do color blending)\n\t\t\t\t\t\t\t\t\t\n\n call \"gen textures\"\n\n call \"update track\"\n\n see riches email for what these things mean\n\n tip: you may get patches of texture that are white. These reference textures that do not exist (e.g. yadd_GSGS)\n \n these will be added soon. A workaround is to make you road a little wider so that these cases do not occur.\n\n\n\n see dwMPtest for an example\n textures\\terrain\\mask2_GGSS is an example of a blended mask\n\naug 27\n---\n\neach check point has a \"roll gain\" this will cause the road to bank around corners.\nsetting to 0 eliminates the effects, >1 exaggerates it.\n\n(rich)\n\n---\n\nTerrain editor update:\n\nrecommendended procedure:\n\nadd \"draw_path_splines 1\" to your mod2k.psc\n \nCreate a race loop (ef_check_points)\n you can now call \"split\" on a path to insert a new check point between the previous points\n you can now call \"remove\" on a check point, and the paths will attempt to repair themselves\n\nCreate a height field that will represent the terrain\n\nset the height fields road and off road textures\ncall update_track on the height field\n\nupdate track does the following:\n\t\t \n all control points that are not indicated as locked\n get:\n their texture set to off road\n\t their height set to high_z or low_z depending on their setting\n\t \n Each ef_path marked as \"make_road\" walks along its spline ensuring all terrain points\n within its radius (defined but the radius of the two check points being joined) are at the same height as \n the spline at the closest point from the point to the spline\n \n A filtering pass smooths out adjacent terrain points to reduce \n\n All patches that are considered \"unused\" (e.g. tops of mountaints) have their textures removed, and these will be\n used to automatically generate portals and rooms\n (black stips in your height field are good. they improve performance)\n\n\n\nSee dwMPtest and dwMPtest2 \tfor an example\n\n\n\n---\n\n\n\n\nnew flag in psc:\n draw_path_splines\n \n set to draw path splines\n\n\nnew flag in psc:\n disable_smoosh \n\nnew flag in pack:\n can_deform\n\n\nnew flag no_damage 1\n\n\n\ndraw_path_splines 1\n\n\naug 24\n---\n\nnew for height field patches:\n \"Copy\")\n\/*?\nCopies the selected patches to the patch clip board\n\n Useful for moving hills and such\n e.g.\n select the grid of points that make up the hill\n call copy on a center point\n\n call paste on another point somewhere else where you want a hill \n\n*\/\n\n \"Paste\")\n\/*?\nPastes the selected patches from the patch clip board\n\n Useful for moving hills and such\n e.g.\n select the grid of points that make up the hill\n call copy on a center point\n\n call paste on another point somewhere else where you want a hill \n*\/\n\n\n\n\naug 23\n---\n\nnew for height field patches:\n \"Copy height to selected\" )\n \"Average height to selected\" )\n\n \"flatten selected\" )\n\/*?\nFlattens selected points onto a plane computed as a least \nsquares solution of the selected points\n*\/\n \"Shear selected\" )\n\/*?\nThe x y components of the vec stack are the slopes used for the shear\nselect a number of verts\nwrite an x and y slope to the top of the vector stack\nright click on a pivot vert and click shear_selected \n\nall verts will have height += (Vx - pivotVx) * shear_x \n +(Vy - pivotVy) * shear_y;\n*\/\n\n\n(rich)\n---\n\n\nDll's are not read from shared. you must copy them locally\nthis is to avoid the \"read only\" problem\n\n(rich)\n\n---\n\nnew psc op: \n \n print VAR\n \n e.g. \n print warp_ks\n\n\n prints the value of var\n \nnew psc op: \n \n help VAR\n \n e.g. \n help warp_ks\n\n\n prints the help for var\n\n---\n\nnew psc func:\n\n save_settings\n\n \"Saves all written vars to settings.psc, you can include this file in your war.psc (note does not yet store bindings)\");\n\n\n---\n\n\nnew for l1_rtf_car:\n\nwheel_radius { rear, front }\nThis should be set to the approximate radius of the cld rep of the wheels\nIt is only used for squash and deformation calculations\n\n---\nl1_rt_func->b_has_Step_hook has been replaced with:\n\n step_hook_id \n\n enum\n {\n step_hook_none, \/\/ no step hook\n step_hook_0, \/\/ these step hooks are executed first, should be used for planners (ai, player)\n step_hook_1, \/\/ these step hooks are executed after hook_0's, should be used for controllers \n \/\/ (so that they will respond to planner inputs without latency) \n step_hook_post_integration, \/\/ takes place after integration and position\/object update. \n \/\/ This is a good time to spawn objects.\n \/\/ Weapons use this\n\n };\n\nYou will need to recompile \n\n\n---\n\n\n\naug 18\n---\n\n\nFor piapi,\nplease add the following to your C++ project build options :\n\n \/QIfist\n\n---\n\nThe check points use splines\n\nsee dwMP test for an example\ndwBounder2 is an ai with a race state\n\nI will be adding api extensions to support races this afternoon\n\n\n\n---\n\n\nCheck points use this convention:\n\nz up\nx forward\ny left;\n\n---\n\nyou can shift select items in a tree view and all items between wil be selected\n\n---\n\nnew function for check_point:\n\n auto_align\n\n---\n\n\n\nSignal mappings (new, old)\n\n\n signal_id_pack_0 signal_id_one\n signal_id_pack_1 signal_id_time\n signal_id_pack_2 signal_id_pack_life\n signal_id_pack_3 signal_id_pack_speed\n signal_id_pack_life signal_id_pack_0\n signal_id_pack_stun signal_id_pack_1\n signal_id_trigger_0 signal_id_pack_2\n\n\n so if a legacy signal references \"pack_2\" change it to \"pack_life\"\n\n\n\naug 15\n---\n\n 4 modes for local\/remote sim (was prviously just a bool )\n\n local_sim: least expensive\n local_sim_remote_spawn: when the object is created, a copy of it is created on remote machines.\n\t\t\t\t\t\t from then on its on its own\n\n export_no_transfer: object is exported, never transfered (useful for player)\n export_transfer: \t object is exported. it will be transfered if another player is better off owning it.\n\n\n\nmp first pass:\n\n General recomendations:\n\n weapons that fire projectiles should have these set to local sim\n they should _not_ have b_disabled_if_remote set\n\n auto attachments (hammer) should have b_disabled_if_remote\n\n user car should be set to export_no_transfer\n\n\n\n---\n\nThis is how the lighting\/shadow system currently works:\n\nlighhting is done via shadow maps or vert lighting\n\nShadows are projections of the objects shadow rep \ndrawn (modulated) on any polys that their shadow volume intersects.\n\nThe shadow volume for an object is created using the closest light to the object only.\n(Two overlapping lights will only cast 1 shadow, so you should try to avoid overlapping lights)\n\n\n---\n\n\naug 14\n---\nThere have been a few changes to the api that may require changes for all using the custom api:\n\nnew flag for l1_func: b_disabled_if_remote\n\nSet this flag on ctor if you would like your custom to never recieve active_change() (or side effects of) \nif the functional is in a remote pack. (network)\n\nowner_active_change has been superseeded by pack_change\n\nThis is called when:\n\n pack becomes active\n pack becomes inactive\n an auto mount takes place\n an mount is destroyed or broken off\n a network pack changes from local to remote or vice versa\n\n Please see weapon_hammer.cpp for an example of changes that could be made to accomodate this\n\n\n---\n\n\n\n\nAug 13\n---\nexporting will export pid referenced objects from\nef_customs\n\n(daniel)\n\nAug 12\n---\n\nmod and war automatically search the Shared\\customs dir (set in the psc) so you do not need to copy them to your local machine\n\nmake sure to include the shared dir in war.psc\n\n(don't forget to remove this for compiles)\n\n\nAug 12\n---\n\n\ndwhudexpert.cpp upated.\n\ndwhudexpert sets levels that the user can play (under \"arenas\") and cars that the player can choose\n\n\n---\n\n\nNew psc command: \n\nspawn_virtual \"dwhudexpert\"\n\nthis must be called after init_game and before start_flow\n\ne.g.:\n\n\n\ninit_game\n\n\nspawn_virtual \"dwhudexpert\"\n\n\nstart_flow\n\n\n\/\/end\n\n----\n\n\nTo run War.exe you will need S:\\w\\maps\\links\\*.*\n\nyou will need to del rtd and update_rt()\n\n---\n\nfix: range limits would be used by actuators event if range_wraps was set.\n\n(daniel)\n---\nexported frame functions\n\n(rich)\n---\n\nexported rtf_check_point::dti (class info)\nalso rtf_path::dti\n\n(rich)\n---\n\n\nAug 10\n---\n\ndavid project updated\n\nThere is a batch: david!\\batches\\dwhudexpert\n\t\t\t with an ef_hud_expert in it.\n\t\t\t drop this into a level (its virtual) and it will draw\n\t\t\t hud stuff \n\t\t\t (currently just race trace, speed and health)\n\nYou can modify this starting with hud_expert*.* in pipapi\\david\nmake sure to rename it. customs use their name as a class guid\n\n(rich)\n---\n\n\n\nAug 9\n---\nall sorts of little bug fixes\n\n---\n\nmesages with a delay will not store link arguments (ob, position etc)\nthis is a performance optimization.\n\nIf a delayed message requires link arguments there are workarounds using instant \nmessages and explicitly caching the link data\n\n---\n\nYou must create 2 dlls for linking , for mode and war\n\ne.g.: david_mod2k.dll\n david_war.exe\n\nsee proj\\david\\*.* for a sample project that has settings for both s.t. batch build makes 2 dlls\n---\n\nnew for l1_pack: max_draw_distance\n\nThis was set to 2048 by default. now 256\n\n---\n\n\n\n\nAug 8\n---\n\nfirst pass on plunger: (grappling hook)\n\nSample is in dw_bounder1\n\n\nfirst pass on multi-plunger: (web gun without web gun artwork so I used plunger)\n\nSample is in dw_bounder0\n\n\n\n---\n\n\nIn order to run this new version you will need to copy:\n\nshared\\w\\custom\\david.dll\n\nto your\n\n[mod2k]\\custom\\david.dll\n\n---\nNew weapons:\n\n Hammer (see dw_bounder, trigger 0 )\n\tThis needs a little work. \n\t\n\t Currently uses a rotate about y swing.\t ( comes down to hit the ground )\n\n\tThe rotate about z swing (hit from the side) was far more effective when I tested it, but it didn't look right\n\tI tried a compromise (rotate about x - z ) while effective, it didn't look right either\n\t\n\t\n Plunger:\n Doesn't have a spring yet. I plan to finish this up this afternoon\n\t\n\t \n\n These both use ef_customs\n \t\n\n \n\n\n\nAug 7\n---\n\n\nnew for height field points:\n\npaint selected\n\n(Rich)\n---\n\nbug fix: upper case extensions for textures would cause problems on import \n(e.g. \"TGA\" )\n\n---\nSignal system updated and revised. \n\nNote: unfortunately the signal ids have been been reordered.\n You will need to update all signal regerences (e.g. pack 0, pack life, etc)\n \n\n---\n\n\n\n\nAug 6\n---\n\n\nnew dw_bounder0 with nifty glove. (courtesy of Rich being a 3d artist)\n\nSpecifics\/Functionality involved:\n\n root dof is a 10 (slider)\n range is -0.125 .. 3 (it can extend 2 meters)\n damping is 0\n actuate_kd = 11 (default)\n actuate_ks = 8 (higher than default for more speed)\n\n Q Max is 0 (which means infinute)\n (this is this max force it can apply internally, if the trajectory specified goes beyond this the dof will fail)\n\n dof reads input signal 0 \n dof binds signal to position\n\n an ef_signal amplifies the trigger_0 signal, \n (linear, v0 =0, v1 = 2, t_input = 1, scale = trigger_0 )\n \n shifting it from \n not presed == 0\n pressed == 1\n to\n not presed == 0\n pressed == 2\n\n (so that it extends 2 meters)\n\n\n When player or AI presses trigger 0, the arm extends to 2 m, when the trigger is released it goes\n back to 0\n\n---\nin order to scale, transform etc meshes, the pack must be selected\n(click it once on the tree view)\n\n\nAug 5\n---\n\n\nbug fix: save as would crash if your initials were much longer than the name of the object\n---\n\nRight now the bounder has an ai and a player\nTo drive the bounder, turn off the ai, and turn on the player\n\n\n---\n\nif you set up links between check points, you will need to remake these\n\nto link two check points, drag the first onto the second (the order matters)\neg for :\npoint 0 onto point 1\npoint 1 onto point 2 \npoint 2 onto point 3 \npoint 3 onto point 0\n\n\n\nAug 3\n---\nstandard procedure for mapping an old mod object:\n\nselect surface\nset map mode to cylinder\nset z to -1 0 0\nset x to 0 0 1\n\t\t \npress normalize u\npress normalize v\n\nsee dw_bounder0 for an example\n\n\n\n\nAug 2\n---\nNote: damping is now applied to dof_30 (particles), Make sure to set this to 0 for free\nflying particles (default kd is 2)\n\n\nj28\n---\n\nheight fields now generate hulls on the fly.\ndon't forget to remove their cld reps (see below)\n---\nnew flag for height field: b_collisions\nturns on\/off collisions\n\n----\nnew for height field:\n\n remove_cld_rep\n\n(rex)\n---\nThese psc vars are used to tweak lods of height fields:\n\nfloat lod_z_min 24 \/\/ distance offset, between 0..24 there is little change in lod, this reduces poping)\nint lod_max 3 \/\/ max subdivions for any given patch, only reached in rare circumstances) \/\/ min detail\nfloat lod_gain 6000 \/\/ overall scale of the lod\n\nsubdivision for a spline edge are :\n \n curvature_along_edge \/ ( sqr(distance of mid point of edge to camera ) + square(lod_z_min ) ) * lod_gain \n\n clamped to lod_max\n\n distance is not spherical, but ellipsoidal, x, y are scaled by 2 to place greated emphasis on things closer to the\n center of the screen\n\n\n---\n\n\n \n\n\nj27\n---\n\nnew class: rtf_weapon\n\n\nThe following need to be updated to support:\n\ndw_shot_gun has been updated (saved as on rh_shot_gun_animated)\n\ndw_drone2 has been updated (saved as rh_dron0.dwn)\n\n\nShot gun is a little flakey now b\/c the recharge time is less than the animation time\n\n---\n\ntriggers and jump have both\nbeen converted to signals from pulses\n\nThis means that holding them down repeatedly performs the action\n\nYou will need to change:\n\t\t\t\t\t\t\t \nbind space jump 1\n\nbind 1 trigger_0 1\nbind 2 trigger_1 1\n\nTo:\n\nbind_sig space jump 1\n\nbind_sig 1 trigger_0 1\nbind_sig 2 trigger_1 1\n\n(difference based on your bindings)\n\n---\n\n\nj26\n---\n\nfirst pass on hover flight model\n\ncheck out: david!\\levels\\dw_terrain_test (courtesy of rh)\n\ndrag david!\\dw_hover.dwb into you sim options \n\n\n\n\nj25\n---\n \n first pass on cld_rep construction\n right click on a height field and call: make_cld_prep\n It can take some time on large height fields\n\n---\n\n ef_height_field has material_id \n\n---\n\nplayer_height\nand\nplayer_step_height\n\nare no longer used\ninstead the cld_rep of the player must have a \"foot\"\na \"foot\" is a cld_prim (should be a sphere)\n\nthat has it's \"special\" flag set to \"fps foot\"\n\nNormal collision detection is performed\n when there is an intersection, the forces applied are player leg springs \n rather than rigid collision reaction\n\n\nSee template\\player.dwb for an example\n\n\n\n\n---\n\n\nj24\n---\n\n when growing a height field, height, tetures, etc will be propagated to the new strip\n\n---\n\n each patch has a 'tile_count' member which controls the texture scale\n\n---\n \n fixes to shadow map generation for tiles\n\n---\n\n \n\nj23\n---\n\nNew class:\n ef_height_field\n Currently these draw, but do not cast collisions\n\n\nHeight field\/terrain object\nlb is ignore, the basis of the frame in which this is located is used.\nUse Add\/remove strips to resize \n\nTo modify heights:\n Turn on draw_terrain (flag on mesh_view->options)\n select the little white dots that appear\n move them around. They can only much up and down (height)\nfor other motions, move the packs\/frame\n\n\npsc_ops:\n terrain_lod_gain (default 12), linearly scales the number of subdivisions for the\n splines. higher values will create more subdivisions (smoother surface, more polys)\n\n\n terrain_max_dim (default 5), \n Sets the max subdivisions for a given path\n a 5x5 subdivision of a patch yeilds 5*5*2 = 50 triangles\n\n\nsee david!\\levels\\dwterrainlevel for a sample\n\n\n---\n\nyou set the extents of a level explicitly (member of g_level)\nanything outside of the extents\twill be destroyed\nThe number of rooms\/sectors created is:\nspan_x*span_y*span_z * K, so attempt to minimize extents whenever possible.\n\n\n\njuly 22\n---\n\nbug fix: setting mip_levels to 0 or 1 did not disable mip mapping on TNT\n\n\n---\n\nMost ai vars move from psc to l1 \nAll of these should have help\n---\nexported drone\n---\nmust wipe rtd\n---\nfixed pointer conflict bug on export\n---\nadded psc op: \"reload_materials\" \"Re loads materials.dat\" \n---\n\n\n\njuly 21\n---\n\nnew flag for mesh view: draw_messages\n\nthis is preliminary, and while not really practical, it is kind of neat\n\n\n---\n\nCopy to clip board did not work when messages were sent outside of the packs copied\n\nThe following system is used to resolve external links:\n \n -if a message target is an object contained within the selected packs, \n it will be re-linked to the newly created object\n -if a message target is a resource ob, it will stay bound to that ob (e.g. l1's PIE)\n -if a message target is an object in the current batch not included in the selected packs, \n the newly created message will be directed towards the same object in the level.\n When this happens, copy will print \"link NAME\"\n\n(rich)\n---\n\n\npacks in tree view of level\/batches do not show up if their class is invisible\n(there is a packs tab, that when opened will show all packs)\n\n---\n\ndefault operation for draging backs onto batches is copy \n(was move)\n\n---\n\nshift click for property window will place the window lower down\n\n(rich)\n---\n\nsave as now swaps dir as well as initials\n\n(rich)\n---\n\nmouse jerkiness has be reduced\nThis would occur mainly at low frame rates\n\n(dan)\n---\n\ndragging a message batch onto another will append the messages from the source to the dest\n\n(rich)\n---\n\nexported dw_drone1\nPlease let me know where improvements should be made\n\n---\n\nnew for edm_spawn:\nfloat,recoil_mass)\n\nDetermines the effective mass of what is shot for the purpose of recoil\nIf this is > 0 the source of the spawn message will take an impulse of:\n(spawned_object_v - source_object_v) *recoil_mass\n\n\njuly 18\n---\n\n\nyou will need to del rtd\n\n---\n\nbug fix: sub_target id was lost on save\n\n---\n\nyou will need to del rtd\n\n---\n\nhopefully fixed first frame at full problem that sonya was experiencing\n---\n\nrtf_sprites have a new member: draw_bound_r\nThis is used when culling the sprite. It should be set to the maximum possible size that they sprite will be\n\n\n---\n\nc_offset added to spawn message\n\n---\n\nnegative impulses are filtered and do not call the tb_cld sound api\n\n---\n\nnew flag for packs: destroy_on_impact\nshould be used for all shells\n\n---\n\n\njuly 17\n---\n\nnew exe's, must del rtd.\n\nfoot steps seem not to be played at all (for drone, player works okay)\nCould be a bug on my end\nalso new tbapi.dll and materials.dat\n\n\n(andrew)\n---\nmessages sent to pie with sub_target_id set will be redirected to the link ob\n\nthis can be used for example to turn fire on for another barrel\n(daniel)\n\n\n\njuly 16\n---\nThe following assumptions are currenly made for walkers (subject to change)\n\n -feet dof's are marked as feet\n -foot dofs have their x axis aligned with the body x axis (forward)\n -and z axis pointing left (to rotate about ankle), y axis is up\n (e.g. take root dof and rotate it 90 degrees about x and you have the lb.A of the foot)\n -the cofm of the foot is approximately where the foot touches the ground\n (usually a little below the ankle rotation point)\n -the cofm of the root is fairly close to the cofm of the object\n -the root is heavy compared to the legs\n\n---\n\njuly 16\n---\n\nmessages print out their name, type and target on message_buffer_overflow\nthis might help in debugging\n\n(daniel)\n---\nrtd must be wiped\n\n---\n\n\nsound and music names are loaded from tbapi.dll\n\nnote: if use_sound is zero, this will not work\n\n---\nbug fix: messages to function\n\n\n\n---\nnew psc op: (float,player_step_height,(0.65),\"Max height of things that player and step onto\")\nnote: if player_height - player_step_height > negative z extent of the players collision rep, you can get stuck in the ground\n---\nthe player flag is set for the player, so the drone should attack you instead of anyone else,.\n\n---\n\n\njuly 14\n---\nnew for set_state: b_relative\n(rich)\n---\n\n\njuly 13\n---\n\n\nfix: export did not export packs referenced by edm_spawn bundles\n\n---\nnew function: file->\"Aggressive Save All\"\n\nSaves all open objects, ignores modified flag.\n\nUse this when save_all does not cooperate\n---\n\n\njuly 12\n---\n\nfor good time, try: w\\david!\\level\\dwtiger lkevel\n\nthe drone has a built in sensort that turns itself on when an object enters and off when an\nobject leaves\n\nparticle starts inside a sensor and immediately turns drone on\n---\n\nnew func: sensor\n\n-only extent sensor is suppored.\n\nexample is inside drone.\n---\n\nA few objects have default messages, (func's, batches, pids).\ndragging these into a message batch will add the default message\n(e.g. start and animation or turn on a func)\n\n---\n\nnew funcs for packs: \"select equal verts\")\n\"select connected\")\nuseful for added verts to dofs\nNote: these functions will bridge accross duplicated verts used for surfaces\n\n---\nbug fix: export did not export message dependancies (edm_spawn)\n---\nreminder: changes to Ir vary moments of inertia in a quadratic manner \n \t\t small changes will have dramatic effects on the motion of the object\n\n---\nupdates to sound and damge generation.\npreviously I used the computed accelerations based on contact force, to determine \nthe threshold. \n\nNow I use the initial conditions (initial velocity)\n\nthe problem with the former system is that it did not take into account force cancellelation from\nmultiple contacts\n\nthe problem with the latter system is that it does not take into account force cancellelation from multiple contacts,\nbut it handles it way that seems to work better.\n\n(e.g. __max(a,b,c) rather than |a|+|b|+|c|\/3 )\n\n---\n\n\njuly 8\n---\n\nTips for setting stable and accurage moments of inertia:\n\n\nIr should be max(0.4,distance of vert farthest from cofm )\n\n\n\n\ncofm close to volume centroid of cld rep\n\n\nrequests on crate:\n\nIr to .5 .5 .5\ncofm up 0.0625\n\nsome of the debris has Ir that is a little large \ntoo large Ir leads to large angular momemtum and slow wobbling.\ntoo small Ir leads vibration, shaking, and never resting\n\n\ntoo large similar to cannibis\ntoo small similar to methamphetamine sulphate\n\n\n\n---\n\n\npsc scriping in. \nSee war.psc for a sample implementation\n\nnot thoroughly tested\n\n---\nfog functionality\/hack is in.\nset the far_z for the level, this is where fog will be at 100%\nset the fog color.\ncheck use_fog.\n---\nnew tbapi is in\n\n---\n\njuly 8\n---\n\nnew function: remove usessless dofs\nusing all the remove *.* functions can significantly improve preformance on some models.\n\n(Rich)\n---\nyou can now remove dofs that have motions attached without destroying the motion (keyframes for those frames will be\nremoved, but in certain cases they are unnessary anyway) (e.g. superman)\n\n(rich)\n---\n\nbug fix: help was broken\n\n(daniel)\n---\n\npreviously the player and dof_30 (particles) had 0 friction\nthis has been removed. You can emulate the behaviour using a material with 0 friction\n---\nCertain prims would not draw \nsuch as the cld rep\ndel rtd to fix this;.\n\n(Daniel)\n---\n\non packs you can select: \"dofs\"\nand \"cld_rep\"\nto see a number of common members together\n---\n\njuly 7\n---\n\npack->remove_unused surfaces removes unused surfaces (good idea)\n---\nyou can remove a tree of dofs by rick clicking \"remove tree\"\n\n---\nexport exports edm_spawn bundles\n---\nedm_play_sound switched to a number\n---\n\nframes can accept an edm_play_sound message (playback is at cofm of frame)\n---\nmessage baches have a right click \"empty\" function to remove all messages\n---\nanimation can \"load motion cues\"\n\n- procedure: place \"soundmotioncues.txt\" in your mod dir. (from s\\w\\)\n- edit file as necessary\n- click on each animation and call load motion cues\n- take a break and a shot of rye\n\nediting the file:\n\n - frame names may need to be changed (\"I used frm-lankle\")\n - motion names need to be changed (I used 1-115,.. etc )\n\n\n(rich, andrew)\n\n---\nnew message for packs: edm_set_state (position, velocity)\n---\n\ncamera roll tightened\n---\nl1 messages can exist between objects in a pack if the following conditions hold:\n\nthe message is in any l1 member of the pack (func, frame, etc)\nthe target of the message is a func, dof or pack in the pack\nthe dispatcher of the message is a func, dof or pack in the pack\n(most l1 message batches are dispatched by the l0)\n\nAn example of this is:\n\nedm_command sent to pack on complete messages of an animation\nedm_command sent to an animation on complete messages of an animation\n\n\n---\n\nbug fix: decay works for fixed objects\n\n---\n\nbug fix: l0 's would occasionally print their pack name as l1_[class]\n\n\n---\nnew message: edm_move_camera\n\ndrag this from pie to host startup messages\nset its name to intro_pi\ncopy intro_pi.pi into your mod dir\nclick \"load\"\n\nsuccess! go get a coffee and a kit kat - you deserve it.\n\n\n(rich)\n---\nnew func: ef_sound\n\nplays a looping sound\n\n(andrew)\n---\n\n- added a check for closed loop finding in signals\n\nA signal should not directly or indirectly reference itself.\neg. a signal of id 0 should not reference pack 0\neg. a signal of id 1 should not reference pack 1\n\n(daniel)\n---\nnew func: ef_timer\n\n(daniel)\n---\nimport testing:\n1-115 : okay\n115-230: not okay\n230-300: okay\n300-380: okay (looks like 1-115)\n380 550: okay\n655 810: maybe okay\n810 820: looks like 1-115\n\nplease see dwmsbed.dwl on david\\levels for an example\n\nmost .txt files are not vald.\n\nMotion names must be surrounded by quotes eg.\"run\"\nMotion ranges must map to frame ranges. \n e.g. in 890 920 , the motion frame go from 1 .. 100 or so\n\ndeleting them solves the problem.\n\n\n\n---\n\n\njuly 6\n---\n\nwhen search for frames, animations will do partial name searches\n\n(rich,mikeo)\n---\n\nRemeber to zero_all_dofs before transferring anyting from one pack to another\n\n(rich,mikeo)\n---\nbug fix: ref ptr.h assertion on select vert\n\n---\nbug fix: collision damage_scale not always applied\n\n(rich)\n---\nwhen dragging packs onto packs you can use \"replace surfaces\"\n\n(rich)\n---\nthreshold distances for vert combine reduced\n\n(rich,sonya)\n---\n\n\n\njuly 5\n---\n\nNew toggle for packs:\n\ncollision mode:\n\"normal\", \"none\", \"particle\"\n\nnormal collides with normal and particle\nparticle collides only with normal\n\n(rich)\n---\n\ncollision speed sound threshold decreased to 1.0m\/s (was 3 m\/s)\n\n(andrew)\n---\n\nResolutions that do not have square pixels (e.g. 1280x1024 and 640x400) did not do mouse selection properly\nJust about every other supported resolution is okay. (y_res\/x_res should be 0.75)\nI could caution against these resolutions as they distort the way in which images appear\n\n(everything is wider than it should be)\n---\n\nnew command: view->watch_selected\nwatches the point at the average of all selected verts and objects\n\nhot_keys.dat on S:\\w\\ has this command linked to a tool bar bottom\n\n---\npacks have l0_destroyed_messages and l1_destoyed_messages\nthey are both dispatched on destruction\n\nl1's should be used whenever the messages are shared.\n\n(rich)\n---\ndm subdir copied form s on init, this prevents the crash\n\n(andrew, rich)\n---\nedm_play sound can now play 2d, 3d or music\n\n(rich, andrew)\n---\n\nThe follow material collision sound ids are valid:\n\n material_cobbles\t= 4,\n\n material_barrel = 6,\n material_crate = 1,\n\n\n---\n\nbug fix on cld_hull\n---\n\n- improvements to collision system for fast moving objects\n- new prims:\n\nEllipse\nCone.\n\nNote: something seems to be wrong with the current cone,. I am not entirely sure what it is\n\n\n---\n\njuly 3\n---\n\t\t\t\t\t \nPrelimary scalar signal spec:\n\nVarious parameters can be assigned signals.\n\nYou will see too settings for a signal e.g:\nscale.v [ 1.0\t]\nscale.id [ none\t]\n\nThe V term is used if id = none, other wise the signal identified by id is used\n\nThe following signals are implemented:\n\n\"one\" v = 1\n\"pack_speed\"\t v = speed of pack in m\/s\n\"pack_life\" v = life of pack (1 == full, 0 == gone), \n\t\t\t\t\t packs with a \"life time\" set linearly loose life until they reach 0, \n\t\t\t\t\t then they are destroyed\n\t\t\t\t\t Particles with add fill mode might hook this to their brightness signal\n\t\t\t\t\t The brightness of the particle will linearly decay until the pack is gone.\\\n\n\"pack_0..pack_7\" v = ef_signal(id)->read()\n\t\t\t\t\t The pack is searched for a signal with the appropriate id, this functional \n\t\t\t\t\t provides the input\n\n---\nnew class: ef_signal\n\n\n This is currenly a periodic\n I will later add support for envelopes and splines.\n\n\n Algorithm to compute value:\n\n float t = t.read() * frequency + offset;\n \/\/ wrap to 0..1 range.\n wrap( t, 0 .. 1 )\n \n float scale = >scale.read();\n\n\n switch(function)\n {\n case flat : \n {\n return t < 0.5f ? v0 * scale : v1*scale;\n }\n case linear : \n {\n return scale*(v0 + (v1-v0)*t);\n }\n case sin : \n {\n return scale * 0.5f *( (v0 + v1) + (v1-v0)*fsin( t * __2_pi_f ) );\n }\n case triangle : \n {\n return scale*(v1 + ffabs( t*2.0f- 1.f ) * (v0 - v1) );\n };\n default :\n {\n __assume(0);\n };\n };\n\n---\n\nstructure points normalized to 1 == max\n\nObjects by default, should always have <= 1 structure point\n< 1 is for damaged.\n> 1 is only for special occasions (such as power ups)\n\nMake objects harder\/easier to destroy by using a material\n \n\ncollision_impulse_to_structure_points_scale decreased to 1\/16k \n\n---\nCollision reps now have collision_messages\nThese are good for:\n\n - edm_apply_damage\t (not implemented)\n - hit effect spawn\n \n---\n\ncollision_impulse_to_structure_points_scale decreased to 1\/2k (from 1\/256)\n\n---\nNew class: ef_sprite\n\nSupports much of the functionality of the legacy ede_particles.\n\nTo set its texture, you can drag an existing mod2k texture into it \nor you can drag an image file from windows. \n \nNote: image files that alias batches and levels cannot be dragged onto a texture pointer.\n\nA sample sprite is now used in dw_particle_test\nThis will be apparent if you use the dw_shot_gun\n\n---\t \n\nEvent handers:\n\n- new class ef_event_handler\n- multiple globally defined events\n- ef_event_handlers register themselves to catch certain event, on these events they dispatch their messages\n- there will likely be 1 or 2 global event handles packs that are used in all levels\n- dw_event_handler is a sample that catches all damage events and prints \"damage!! to the log\n- a more sophisticated behaviour will be created by designers\/artists\/andrew to create such things as particles and sounds\n- the following are currently supported:\n damage_xxx\n destroyed_xxx\n\n---\nnew message:\n edm_play_sound\n supported by: \n PIE\n\ted_func\t(supplys position)\n\ndw_shot_gun makes shot_gun sounds again(!)\n---\nbug fix: merge textures would occasionally duplicate textures\n---\nYou can now drag surfaces from one pack to another.\nrigth click dragging a pack onto another allow you to \"append surfaces\" which copies each surface 1 by one\nWhen you are done, remember to remove the source surface and unused verts\n\nUpdate procedure:\n \n \n 0 Import new object\n 1 load old object\n 2 zero dofs on the old object\n 3 right click drag the new ob onto the old, selected \"append surfaces\"\n 4 go get some coffee while the operation executes\n 5\tremove old surfaces surfaces\n 6 remove unused verts\n 7 save and get out before it crashes\n\n\n---\n\n\njuly 2\n---\ncopy to selected works again\n---\ngravity scale for packs now\n---\nmessage->enum_sources works again\n---\nshow messages_to works again\n---\nwriting to a message will set any object referencing the message to modified\n---\n\nFactory\/Spawn Spec 0.0:\n\n\tef_factory is obsolete (bet you didn't even get a chance to try it out)\n\n\tobjects are created using the edm_spawn message\n\tan edm_spawn sent by a timer is equivalent to the previous ef_factory\n\nTip: you can drag a batch into a message list and it will create a default edm_spawn\n\nThe dw_shot_gun now uses an edm_spawn message dispached from the start_messages of the\nshoot motion\n\n---\n\njuly1 \n---\nalpha works on shadow maps\n---\nnear z clip is at 1\/16 m. Let me know if this is a problem for the shot gun.\t\t\t\t\t\t \n---\nset_switch(off) can be sent to packs to turn them off\n---\nYou can copy cld reps and between packs (or drag onto same pack to make a copy)\n---\npreliminary damage system:\n\nMany principles (damage calculation) same as for gladiator\n\nChanges (will be improved in future)\n\n- each pack has 1 structure point. You can set the health of an object with the \"structure points\" l0 data member of\ned_pack\n\n- Each cld_prim has a material\n- The impulse to structure point scale is 256 Newton Seconds = 1 structure point (was 16k in gladiator)\n\n---\n\n\n\njun 30\n---\ntbapi update\n---\nvrml export for batches (levels) \nright click and export\nname.wrl should be in root\n---\nvrml .wrl import \n- not robust, only tested on mod created exports\n- use .x for importation, .wrl for importing old mod objects and groups\n---\n\n\njun 28\n---\n\nrtm_command now has complete messages\nThese are only used for commands that take time to complete\n\nif start_animation is sent, success or failure messages are dispatched immediately \n (depending on whether or not animation could be started)\n complete messages are then dispatched when the playback is done\n\n (if the messages was not interrupted)\n\n----\n\nnew psc ops:\nplayer_name\nlevel_name\n\n\njun 28\n---\n\nPacks can \"add vert\"\n---\nverts can be deleted (delete key)\n---\n\n\n\njun 25\n---\n\n\nThis is what I did to set up an animation playback test bed:\n\n\n[ setting up shot gun ]\n \n import shot_gun_animation.x\n move cofm down, the right and foward a little (writting offsets to the root dof lb.c )\n save()\n write_rt_batch()\n export()\n\n\n shot_gun_animation.x comes with shot_gun_animation.txt which\n describes the animations encoded in the one playback\n 1 ef_key_frame is created for each animation\n each ef_key_frame is given a sequential sub_target_id, starting at \"motion 0\"\n So shoot has sub_target_id == \"motion 0\"\n reload has sub_target_id == \"motion 1\"\n\n\n[ setting up level ]\n\n- add these lines to controls.psc\n bind 1 trigger_0 1\n bind 2 trigger_1 1\n\n- new level\n- click menu->view->PIe Messages\n- drag text message into host startup messages\n- set text to \"give_player_weapon \"dw_shot_gun\"\"\n- set output_id to console\n\nsim options->do_player sim (true)\n\nstart sim\n\nPlayer will have shot gun on start. \npressing 1 will trigger shoot animation\npressing 2 will trigger reload animation\n\n\nrtf_player sends a rtm_command with a sub_target of \"motion 0\" to the weapon pack when trigger 0 is pressed\nthis message is redirected to the rtf_key_frame with the \"motion 0\" sub_target_id\n\nrtf_player sends a rtm_command with a sub_target of \"motion 1\" to the weapon pack when trigger 1 is pressed\n\n\n\n---\nNew .psc function\n\ngive_player_weapon \"weapon\"\n\ne.g.\n \n give_player_weapon \"dw_shot_gun\"\n \n [loads rtd\\dw_shot_gun.drb and gives to player]\n\n\nThis is a hack\n\n---\nmouse binding fixed\n\nYou can invert mouse pitch with\n\nbind_sig mouse_y pitch -1\n---\n\nHelp on edf_key_frame:\n\n\nKey frame animation:\n Provides kinematic input for animations\n \n edf_key_frame stores a number of animations\n each with motion curves for each frame that it controls\n\n motions are started\/stopped with edm_command message\n \n do not use edm_set_switch\n\n\nMessaging:\n\n edm_command \n \n animation_id = msg->process_id\n priority = msg->priority;\n\n if( msg->command == start )\n {\n if( there is a motion playing back )\n {\n if( current_motion->priority <= priority )\n {\n current motion continues\n msg->failure_messages is dispatched \n return;\n }\n else\n {\n current_motion is terminated\n current_motion->failure_messages is dispatched \n }\n }\n\n animation_id is started\n \n when animation is complete, and it was not cancelled,\n sucess_messages are dispatched\n }\n else if( msg->command == stop )\n {\n if( there is a motion playing back )\n {\n if( current_motion->priority <= priority )\n {\n current motion continues\n msg->failure_messages is dispatched \n return;\n }\n else\n {\n current_motion is terminated\n current_motion->failure_messages is dispatched \n }\n }\n msg->success_messages is dispatched\n\n }\n else if( msg->command == query )\n {\n if( there is a motion playing back )\n {\n msg->success_messages is dispatched\n }\n else\n {\n msg->failure_messages is dispatched\n }\n } \n \/\/ end edm_command\n\n---\n\njun 24\n---\n\nyou can set the fov with \"fov 0.5\" in the .psc or console.\n\n0.5 is 90 degrees\n1.0 is 45 degrees\n0.25 is 126 degrees \n...\n---\n\n\n---\n\t \n\n\n\njune 22\n---\n\n\nshot gun will show up in the player view.\nI am note completely pleased with the current implementation, but it is okay to prototype \nart (and animations soon)\n\n---\nreminder: If your level is dark during, drag in david!\\template\\editor_lights.dwb \n\nThis is a dir light that should light everything\n---\ncurrently, dof_02 is unstable. It does not conserve energy\n\n---\n\nfa.ini is now obsolete\ninstead you will need:\nmod2k.psc\ncontrols.psc \n(templates are in \\\\shared\\\\W)\n\n\nbasic format:\n- 1 command per line\n- comments are removed\n- case sensitive, just about everything is lower case\n\nCommands:\n\n- value assignment\n\n [variable] [value]\n e.g. jump_acc 4.5\n\n- function call\n\n [function] [argument] (argument is not always required)\n e.g. toggle_full_screen \n\t\t set_physics_rate 30\n\n(value assignments and function calls are idential internally, function is set_value() )\n \n\n- bind function or value assignment \n \n bind [key] [variable] [value]\n or\n bind [key]+[key] [variable] [value]\n or\n bind [key]-[key] [variable] [value]\n \n [key] function will be triggered when the key is pressed\n [key]+[key1] function will be triggered when the key is pressed and [key1] is down\n [key]-[key1] function will be triggered when the key is pressed and [key1] is up\n\n e.g. bind space jump 1\n\n\n bind space+shift jump 1\n\n- bind signal\n\n bind_sig [key] [signal] [scale]\n or \n bind_sig [key]+[key] [signal] [scale]\n or \n bind_sig [key]-[key] [signal] [scale]\n \n\n bind_sig up_arrow thrust +1\n bind_sig up_arrow+shift thrust -1\n\n---\n\n\n\n\njune 21\n---\nnew funcions:\n\n pack->combine_equal_verts\n combines verts with the same position, uv and dof\n\n surface->break_up\n breaks up a surface into a number of surfaces\n each sub surfaces is created by computing the connected set of faces and verts.\n\tif the surface is completely connected it will not be borken up\n\tif it is disjoint it will.\n\n\nOn all buildings use: \n combine equal verts\nif the building has shadow map errors, select the apropriate surfaces and call break_up\n\n\n\n---\n\n\njune 20\n---\nIn the last update, config was initialized to set all pack classes as hidden\nThis has been fixed\n\n\n---\nfunctionality update:\n\n added a new class owned by textures that allow different textures to share the same image file\n added function to pack: remove duplicate textures \n\n without these the tripod rtd is 25 meg\n\n---\nyou will need to remove certain lines from fa.ini dealing with sound \n\nsound_freq 22050\nsound_write_lead 100\nb_disable_dsound_3d 1\n\n---\nFootsteps and jump sounds thanks to the new and ultra fast programmer Andrew;\n\nYou will need TBAPI.dll\tin your mod dir.\n\n---\n\n\n\njune 19\n---\nTab-4 then Tab-5 to get visible poly count works again.\nThis does not include polys for multitexture prims, and it\ndoes not include backfacing or culled polys.]\n\n---\n\nfa.ini has been updated. There are a few fps related parameters at the bottom that you can muck\naround with\n\n\n\n---\n\nmouse look and strafe first pass\ncurrent keys:\n up arrow -> forward\n down arrow -> back\n shift -> toggle strafe (for left, right keys)\n , -> strafe left\n . -> strafe right\n left arrow -> turn left \/ strafe\n right arrow -> turn right \/ strafe\n\n space -> jump\n c -> crouch\n mouse -> look about\n\n---\nnew func: ef_spawn_point \n\njust like ef_start_position.\n\nYou can draw david\\batches\\dwStartPoint.dwb into your level\n\n---\n---\n\n\n\n\njune 14\n---\nuse file->update_rt if your spheres, cones, cubes are not showing \n(must restart mod to see effects)\n---\nanimation playback is temporarily broken\n\n---\nfps_player is temporarily broken\n---\nfps_player is fixed\n---\nexport exports textures if they are newer than the version on shared.\n---\n\n\n\n\njune 13\n----\nif mod crashes when you open, del your rtd dir.\nif it still crashes come and yell at me.\n---\n \n\n\njune 10\n\nNew for Pack:\n\nClass\n\nThe class of the class is used primarily to facilitate edit operations\nand organize packs.\nEach class can be toggled to hidden or visible, and can be disabled or enabled as \na mouse target.\n(e.g. most of the time you do not want to drag road sections.\n\n\nNifty new buttons and sliders to facilitate moving objects\n\n\n\n\n\n\nmod2k is rtm :o\n\n- Please get latest fa.ini and hot_keys.data\n\n- Various changes to undo sytem\n\n- surface limit bug fix.\n\n- sim_options->shadow map only and texture_map_only fixed.<\/code><\/pre>\n\n\n\n<\/pre>\n<\/details>\n\n\n\n<\/p>\n\n\n\n
<\/p>\n\n\n\n
It’s extremely rare to come across such detailed information such as this, and it’s really great insight into the development of this game. <\/strong><\/p>\n\n\n\nIn this archive, I’ve effectively uncovered all aspects of the game, .PSC files are plain-text Pseudo Interactive Script files (… which can be edited!) and BTE files appear to be track\/level\/mesh data and .PSM files are textures.<\/p>\n\n\n\n
pitaDebug 1\nsimVerbose 1\n\/\/dxDrawShadow 1\nnukeAis 1\nuse_sound 0 \/\/ disable for no sound\ndrawHullFaceAlpha 128\nuseMouse 0\ndisable_reload 1\ndsUseAdpcm 1\n\/\/doIntroSequence 0\nisSuperUser 1\nshared \"s:\\w2\" \n\/\/shared \"s:\\dev\\gangbusters\" \n\/\/enableSurfaceBreakup 1\ndrawAiPaths 0\ndrawOtherPaths 0\ndrawRoadPaths 0\n\ndxPreCompressTextures 1\nModFileNameVerbose 0\nfpuVerbose 1\ncameraVerbose 1\ndxDrawSilo 0\ndxDrawShadow 0\nbind delete view_left 0\nbind pgup view_right 0\nbind insert view_distance 0\n\/\/carVerbose 1\n\/\/toonVerbose 1\nbind t toggleWatch 0\nbind e toggleAi 0\n\/\/carVerbose 1\n\n<\/pre>\n\n\n\nBefore moving on I decided to implement my findings with the archive format, and now you can fully extract and create your own “SMALLF” archive files… and better yet, this doesn’t just apply to this game..<\/p>\n\n\n\n
<\/p>\n\n\n\n
Debug!<\/h2>\n\n\n\n I decided to look into Cel Damage, just to see if there were any correlations at all, and to my surprise, I was able to find almost the exact same structure!<\/p>\n\n\n\n <\/figure>\n\n\n\nAmazingly, after this many years, we can actually enable full debug menu functionality, hidden away within Cel Damage for PS2 – and using the exact same method discussed earlier!<\/p>\n\n\n
\n
<\/figure><\/div>\n\n\n
<\/figure><\/div>\n\n\n<\/video><\/figure>\n\n\n\nAnd, as if that wasn’t enough, the exact same archives are used in Cel Damage<\/strong>!<\/p>\n\n\n\nAn interesting point is that the debug menu for Cel Damage says compiled on Jan 25 2003… but Cel Damage was released in December 2002. This implies that the developers found a bug or perhaps wanted to change something after the initial versions of the game were released. <\/p>\n\n\n\n
<\/p>\n\n\n\n
Conclusion<\/h2>\n\n\n\n The Vectorman builds opened the doors to a lot of new information, detailed debug menus locked away in multiple titles & builds, and ultimately modding support, through the tools created during the initial analysis and research undertaken so far. The Pseudo Engine appears to be a highly competent engine with a deep emphasis on physics simulation, complete with its own custom scripting language and memory-optimised asset management systems. Overall, what the team was able to achieve is impressive, especially for the time and my respect goes to the developers who worked on these games, and above all, to David Wu, who died tragically as a result of an unexpected diabetic shock. Cel Damage shown a great application of his works and despite Vectorman never releasing, it’s nice to imagine what could have been, especially with how complex their engine was.<\/p>\n","protected":false},"excerpt":{"rendered":"
A couple of weeks ago I was contacted by Laurent (SEGA Dreamcast Info) who informed me he’d come in contact with some special betas which he’d like me to take a look at. What arrived next was 10 builds of Vectorman for PS2, a previously unreleased title by Pseudo Interactive. Pseudo Interactive had made their […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"yoast_head":"\n
Vectorman: A Reverse Engineering Story - Team Wulinshu<\/title>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\t \n\t \n\t \n