View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0003859 | The Dark Mod | Script/Def | public | 22.09.2014 11:01 | 22.12.2018 09:42 |
Reporter | tels | Assigned To | |||
Priority | normal | Severity | normal | Reproducibility | always |
Status | suspended | Resolution | suspended | ||
Summary | 0003859: Location settings script object always manipulates the ambient light | ||||
Description | The script object attached to the "atdm:location_settings" entity will always modify the main ambient light, even when this is not nec. (f.i. when there are no dynamic parts and a script wants to control the ambient light in a location). | ||||
Tags | No tags attached. | ||||
Attached Files | tels_patch_i_ambient_fade_2014-09-22.txt (13,347 bytes)
--- /home/te/games/tdm/def/misc.def.org 2014-04-25 21:06:08.000000000 +0200 +++ /home/te/games/tdm/def/misc.def 2014-09-22 11:42:24.000000000 +0200 @@ -137,6 +137,8 @@ "editor_float ambient_light_fade_time" "Time in seconds to fade the ambient light to the new color." "editor_float fade_time" "Time in seconds to fade the ambient music/sound to the new sound." "editor_vector ambient_light_dynamic_cap" "Cap the dynamic part of the ambient light at these values. Default is 0.1 0.1 0.1, but other settings can be useful - for instance 0.2 0.05 0.05 in a reddish cave, etc." + "editor_vector ambient_light_dynamic" "The factor to multiply light sources in the current PVS to compute the dynamic part of the ambient light. Default is 0.1 0.1 0.1, but other settings can be useful - for instance 0.2 0.05 0.05 in a reddish cave, etc. See also 'ambient_light_dynamic_cap'." + "editor_bool no_ambient_light_fade" "If set to 1, the main ambient light will not be modified. Can be overriden in each location with 'no_ambient_light_fade' '0' and defaults to 0." "editor_float ambient_light_falloff" "Selects the falloff adjustment for the lights in the current area based on their distance. Possible values: 0 = no falloff with distance, 0.5 = sqrt(distance), 1 = linear falloff, 2 = squared falloff. 1 looks best. This setting can be overriden for each location on the 'info_location' entity. See also 'ambient_light_dist_scale'." "editor_float ambient_light_dist_scale" "An adjustment factor for the distance-based falloffs (if 'ambient_light_falloff' is > 0). Values around 1.0 look best. Can be overriden for each location on the 'info_location' entity." @@ -146,6 +148,7 @@ "editor_setkeyValue ambient_light_falloff" "0" "editor_setkeyValue ambient_light_dist_scale" "1.0" + "editor_setkeyValue no_ambient_light_fade" "0" "ambient_light_dynamic_cap" "0.1 0.1 0.1" "editor_setkeyValue ambient_light_dynamic_cap" "0.1 0.1 0.1" @@ -203,13 +206,16 @@ "editor_var call_once_on_exit" "Name of global script function to be called exactly once when the player exits this zone." "editor_var call_once_on_entry" "Name of global script function to be called exactly once when the player enters this zone." - "editor_var ambient_light_dynamic" "Factor to multiply the sum of all light sources in this location by before adding them to the 'ambient_light'. Set to '0 0 0' to disable dynamic ambient light for this location. Defaults to '0.01 0.01 0.01'." + "editor_vector ambient_light_dynamic" "Factor to multiply the sum of all light sources in this location by before adding them to the 'ambient_light'. Set to '0 0 0' to disable dynamic ambient light for this location. Defaults to '0.01 0.01 0.01'." "editor_float ambient_light_falloff" "Selects the falloff adjustment for the lights in the current area based on their distance. Possible values: -1 = use setting from your atdm:location_settings entity, 0 = no falloff with distance, 0.5 = sqrt(distance), 1 = linear falloff, 2 = squared falloff. 1 looks best. See also 'ambient_light_dist_scale'." "editor_float ambient_light_dist_scale" "An adjustment factor for the distance-based falloffs (if 'ambient_light_falloff' is > 0). Values around 1.0 look best. A value of -1 uses the value from your atdm:location_settings entity." "editor_vector ambient_light_dynamic_cap" "Cap the dynamic part of the ambient light at these values. Default is 0.1 0.1 0.1, but other settings can be useful, for instance 0.2 0.05 0.05 in a reddish cave, etc." + "editor_bool no_ambient_light_fade" "If set to 1, the main ambient light will not be modified when inside this location. If set to '-1', use setting from your atdm:location_settings entity." + "editor_setkeyValue no_ambient_light_fade" "-1" + "ambient_light_falloff" "-1" // use atdm:location settings "ambient_light_dist_scale" "-1" // use atdm:location settings --- /home/te/games/tdm/script/tdm_location_settings.script.org 2013-12-06 18:23:58.000000000 +0100 +++ /home/te/games/tdm/script/tdm_location_settings.script 2014-09-22 12:43:07.000000000 +0200 @@ -60,6 +60,7 @@ float music_volume; /* Tels: Additional members for the ambient light changing: */ + boolean m_al_no_fade; float m_al_fade_time; float m_al_fade_time_default; @@ -129,7 +130,13 @@ music_volume = (sys.strToFloat( sys.getcvar("tdm_music_volume") ) + 40) / 40; /* Tels: Init the ambient light part: */ - + m_al_no_fade = false; + if (getBoolKey( "no_ambient_light_fade" )) + { + m_al_no_fade = true; + sys.println ("Global no_ambient_light_fade = true, will not fade the main ambient light."); + // but continue, because the current location might want to fade the light again + } // the default time m_al_fade_time_default = getFloatKey( "ambient_light_fade_time" ); // set a default @@ -232,7 +239,7 @@ // player entered new location, so update ambient base color and fade time/delay void speaker_zone_ambient::updateAmbientLight( entity locEnt ) { - // sys.print( "Setting ambient in location " + locEnt.getName() ); + // sys.println( "Setting ambient in location " + locEnt.getName() ); //sys.print( "Setting old base to '" + m_al_base + "'\n"); // store the current base and add the old dynamic so we don't experience a sudden drop/raise (bug #2326) @@ -241,11 +248,10 @@ // fade to the new location's color m_al_base_target = locEnt.getVectorKey("ambient_light"); - // tels: can this be done simpler? == "0,0,0" doesn't work, tho - if (m_al_base_target_x == 0 && m_al_base_target_y == 0 && m_al_base_target_z == 0) + if (m_al_base_target == '0 0 0') { // no value found, use the default - // sys.print( "No new target, using default color '" + m_al_default_color + "'\n"); + // sys.println( "No new target, using default color '" + m_al_default_color + "'"); m_al_base_target = m_al_default_color; } @@ -270,6 +276,46 @@ } // time that has elapsed going from base_old to base_target m_al_fade_start = sys.getTime(); + + // See if we need to start or stop fading in this location + boolean no_fade = false; + string fade_key = locEnt.getKey("no_ambient_light_fade"); + if (fade_key == "" || fade_key == "-" || fade_key == "-1") + { + // not defined, use the global setting + if (getBoolKey("no_ambient_light_fade")) + { + no_fade = true; + } + } + else + { + if (fade_key != "0") + { + no_fade = true; + } + } + + // setting changed in this location? + if (no_fade && !m_al_no_fade) + { + sys.println ("speaker_zone_ambient: no_ambient_light_fade = true, stop fading ambient light."); + m_al_no_fade = true; + // If we stop fading the ambient light, at least set the ambient for the new zone, so we + // are not stuck with the old values. After this initial set here, the ambient light will be + // left alone and can be controlled by scripts: + m_al_fade_start = 0; // avoid a ambient_fade_time > 0 preventing this setting here + fadeAmbientLight(); + } + else + { + if (!no_fade && m_al_no_fade) + { + sys.println ("speaker_zone_ambient: no_ambient_light_fade = false, start fading ambient light again."); + m_al_no_fade = false; + } + } + } // compute the current base ambient light based on: old color, target color, elapsed time @@ -376,68 +422,72 @@ // sys.println( "Ambient script check, music_volume " + music_volume + " in location " + locEnt.getName() ); - // Tels: query here the ambient_light_dynamic factor: - vector dyn = locEnt.getVectorKey("ambient_light_dynamic"); - - if (dyn_x != 0 || dyn_y != 0 || dyn_z != 0) + // now fade the ambient light until the next update + if (!m_al_no_fade) { - // save the old dynamic value for a smoother fade (bug #2327) - m_al_dynamic_old = m_al_dynamic; + // Tels: query here the ambient_light_dynamic factor: + vector dyn = locEnt.getVectorKey("ambient_light_dynamic"); - // parameters: falloff, distance_scaling: - // falloff == 0: no falloff with distance - // falloff == 0.5: sqrt(linear) falloff (dist 100 => 1/10) - // falloff == 1: linear falloff (dist 100 => 1/100) - // falloff == 2: square falloff (dist 100 => 1/10000) - // distance scaling: factor to scale the distance, can be used to lower/raise distance factor - // after the linear or square scaling has been used. - float falloff; - falloff = locEnt.getFloatKey("ambient_light_falloff"); // default is 1 - if (falloff == -1) - { - falloff = m_al_falloff_default; - } - float dynScale; - dynScale = locEnt.getFloatKey("ambient_light_dist_scale"); - if (dynScale == -1) - { - dynScale = m_al_dist_scale_default; - } - // adjust the scaling so the mapper can always put 1.0 for every falloff - // good looking: approx: sqrt(linear): 0.01, linear: 0.1, square 1.0 - if (falloff == 0.5) + if (dyn != '0 0 0') { - dynScale /= 100; // 1.0 => 0.01 + // save the old dynamic value for a smoother fade (bug #2327) + m_al_dynamic_old = m_al_dynamic; + + // parameters: falloff, distance_scaling: + // falloff == 0: no falloff with distance + // falloff == 0.5: sqrt(linear) falloff (dist 100 => 1/10) + // falloff == 1: linear falloff (dist 100 => 1/100) + // falloff == 2: square falloff (dist 100 => 1/10000) + // distance scaling: factor to scale the distance, can be used to lower/raise distance factor + // after the linear or square scaling has been used. + float falloff; + falloff = locEnt.getFloatKey("ambient_light_falloff"); // default is 1 + if (falloff == -1) + { + falloff = m_al_falloff_default; + } + float dynScale; + dynScale = locEnt.getFloatKey("ambient_light_dist_scale"); + if (dynScale == -1) + { + dynScale = m_al_dist_scale_default; + } + // adjust the scaling so the mapper can always put 1.0 for every falloff + // good looking: approx: sqrt(linear): 0.01, linear: 0.1, square 1.0 + if (falloff == 0.5) + { + dynScale /= 100; // 1.0 => 0.01 + } + else if (falloff == 1) + { + dynScale /= 10; // 1.0 => 0.1 + } + vector light_in_pvs = $player1.getLightInPVS( falloff, dynScale ); + m_al_dynamic_x = light_in_pvs_x * dyn_x; + m_al_dynamic_y = light_in_pvs_y * dyn_y; + m_al_dynamic_z = light_in_pvs_z * dyn_z; + + // cap the value? + vector cap = locEnt.getVectorKey("ambient_light_dynamic_cap"); + if (cap_x > 0 && m_al_dynamic_x > cap_x ) { m_al_dynamic_x = cap_x; } + if (cap_y > 0 && m_al_dynamic_y > cap_y ) { m_al_dynamic_y = cap_y; } + if (cap_z > 0 && m_al_dynamic_z > cap_z ) { m_al_dynamic_z = cap_z; } + + //sys.print( " New dynamic ambient light cap is: '" + cap + "'. \n" ); + // sys.print( " New dynamic ambient light is: '" + m_al_dynamic + "'. \n" ); + //sys.print( " Old dynamic ambient light: '" + m_al_dynamic_old + "'. \n" ); } - else if (falloff == 1) + else // we entered a zone where the dynamic part is zero? avoid getting *stuck* at the old value { - dynScale /= 10; // 1.0 => 0.1 + // save the old dynamic value for a smoother fade (bug #2327) + m_al_dynamic_old = m_al_dynamic; + // fade it to half the value, over time this will result in 0: + m_al_dynamic_x = m_al_dynamic_old_x / 2; + m_al_dynamic_y = m_al_dynamic_old_y / 2; + m_al_dynamic_z = m_al_dynamic_old_z / 2; + // sys.print( " dyn = 0 0 0, New dynamic ambient light is: '" + m_al_dynamic + "'. \n" ); } - vector light_in_pvs = $player1.getLightInPVS( falloff, dynScale ); - m_al_dynamic_x = light_in_pvs_x * dyn_x; - m_al_dynamic_y = light_in_pvs_y * dyn_y; - m_al_dynamic_z = light_in_pvs_z * dyn_z; - - // cap the value? - vector cap = locEnt.getVectorKey("ambient_light_dynamic_cap"); - if (cap_x > 0 && m_al_dynamic_x > cap_x ) { m_al_dynamic_x = cap_x; } - if (cap_y > 0 && m_al_dynamic_y > cap_y ) { m_al_dynamic_y = cap_y; } - if (cap_z > 0 && m_al_dynamic_z > cap_z ) { m_al_dynamic_z = cap_z; } - - //sys.print( " New dynamic ambient light cap is: '" + cap + "'. \n" ); - // sys.print( " New dynamic ambient light is: '" + m_al_dynamic + "'. \n" ); - //sys.print( " Old dynamic ambient light: '" + m_al_dynamic_old + "'. \n" ); - } - else // we entered a zone where the dynamic part is zero? avoid getting *stuck* at the old value - { - // save the old dynamic value for a smoother fade (bug #2327) - m_al_dynamic_old = m_al_dynamic; - // fade it to half the value, over time this will result in 0: - m_al_dynamic_x = m_al_dynamic_old_x / 2; - m_al_dynamic_y = m_al_dynamic_old_y / 2; - m_al_dynamic_z = m_al_dynamic_old_z / 2; - // sys.print( " dyn = 0 0 0, New dynamic ambient light is: '" + m_al_dynamic + "'. \n" ); - } + } // end no_ambient_light_fade if( locEnt.getName() != m_prevLocation ) { @@ -487,7 +537,7 @@ callGlobalFunction( call, m_prevLocationEnt ); } - /* Tels: Update the new ambient base color and fade times/delays */ + /* Tels: Update the new ambient base color and fade times/delays, as well as m_al_no_fade */ updateAmbientLight( locEnt ); /* Ambient speaker code starts here: */ @@ -665,7 +715,10 @@ } // now fade the ambient light until the next update - fadeAmbientLight(); + if (!m_al_no_fade) + { + fadeAmbientLight(); + } wait( m_updatePeriod ); } tels_patch_j_ambient_fade_2014-09-22.txt (8,154 bytes)
--- /home/te/games/tdm/script/tdm_location_settings.script.ol2 2014-09-22 12:43:07.000000000 +0200 +++ /home/te/games/tdm/script/tdm_location_settings.script 2014-09-22 14:15:14.000000000 +0200 @@ -55,12 +55,14 @@ boolean speaker_on; // checks the turning on/off of channels so that channel-1 only gets turned off once when needed, first time after a transition (not every round) float volumeFactor; // A placeholder variable for the decibel-decimal conversion math float db_factor; // Pre-computes the conversion factor from ln to log2 for decibel conversion. + + boolean m_invalid_zone; // to run some actions only the first time we enter an invalid location // Tels: save the old value of the tdm_music_volume CVAR so we can track when it changes in a location float music_volume; /* Tels: Additional members for the ambient light changing: */ - boolean m_al_no_fade; + boolean m_al_no_fade; float m_al_fade_time; float m_al_fade_time_default; @@ -98,14 +100,17 @@ void RestoreScriptObject(); float getCurrentVolume(entity locEnt); // compute volume of current playing ambient from "volume" spawnarg and menu cvar void updateLoop(); - void updateAmbientLight( entity locEnt ); - void fadeAmbientLight(); + void updateAmbientLight( entity locEnt ); // update the settings on location change + void fadeAmbientLight(); // compute new light color based on location and time + void fadeAmbientLightColor(vector targetColor, float fadeTime); // fade straight to the new color }; void speaker_zone_ambient::init() { sys.println ("speaker_zone_ambient::init() called"); + m_invalid_zone = false; + m_updatePeriod = getFloatKey( "update_period" ); // if == 0? if (m_updatePeriod < 0.001) @@ -131,9 +136,11 @@ /* Tels: Init the ambient light part: */ m_al_no_fade = false; + boolean global_no_fade = false; if (getBoolKey( "no_ambient_light_fade" )) { m_al_no_fade = true; + global_no_fade = true; sys.println ("Global no_ambient_light_fade = true, will not fade the main ambient light."); // but continue, because the current location might want to fade the light again } @@ -147,7 +154,6 @@ // grayman #3132 - the main ambient light doesn't have to be named 'ambient_world', // so ask which one has been assigned the job, if any - entity ambientWorld = sys.getMainAmbientLight(); if ( ambientWorld != $null_entity ) { @@ -168,7 +174,23 @@ m_al_dynamic_z = 0; m_al_dynamic_old = m_al_dynamic; - updateAmbientLight( $player1.getLocation() ); + entity curLoc = $player1.getLocation(); + // skip if we start in an invalid zone + if (curLoc != $null_entity) + { + updateAmbientLight( curLoc ); + if (global_no_fade && m_al_no_fade) + { + // we started in a location that has "no_ambient_light_fade", so set the value at least once + sys.println("Starting location has no_ambient_light_fade true, setting ambient light once to " + m_al_base_target); + vector al_def = curLoc.getVectorKey("ambient_light"); + fadeAmbientLightColor( al_def, 0 ); + } + } + else + { + m_invalid_zone = true; + } // now run in a loop: updateLoop(); @@ -299,13 +321,15 @@ // setting changed in this location? if (no_fade && !m_al_no_fade) { - sys.println ("speaker_zone_ambient: no_ambient_light_fade = true, stop fading ambient light."); + sys.println ("speaker_zone_ambient: no_ambient_light_fade = true, stopping fading ambient light."); m_al_no_fade = true; // If we stop fading the ambient light, at least set the ambient for the new zone, so we // are not stuck with the old values. After this initial set here, the ambient light will be // left alone and can be controlled by scripts: - m_al_fade_start = 0; // avoid a ambient_fade_time > 0 preventing this setting here - fadeAmbientLight(); + m_al_base = m_al_base_target; + // avoid getting stuck at the old dynamic value + m_al_dynamic = '0 0 0'; + fadeAmbientLightColor( m_al_base, m_updatePeriod * 2 ); // avoid too abrupt changes } else { @@ -317,6 +341,33 @@ } } + +// fade the ambient light to the new color (or set it for "fast ambient") +void speaker_zone_ambient::fadeAmbientLightColor(vector targetColor, float fadeTime) +{ + if ( sys.getcvar("tdm_ambient_method") == "0") + { + // grayman #3132 - retrieve the main ambient light + entity ambientWorld = sys.getMainAmbientLight(); + if ( ambientWorld != $null_entity ) + { + ambientWorld.fadeToLight( targetColor, fadeTime ); + } + } + // Tels: if the "fast ambient" method is used, do not fade the light, or + // it would be turned on and interfere: + else + { + // C++ code has this: + // gameLocal.globalShaderParms[2] = ambient_color.x * 1.5f; + // gameLocal.globalShaderParms[3] = ambient_color.y * 1.5f; + // gameLocal.globalShaderParms[4] = ambient_color.z * 1.5f; + // so do the same here: + sys.setShaderParm( 2, targetColor_x * 1.5 ); + sys.setShaderParm( 3, targetColor_y * 1.5 ); + sys.setShaderParm( 4, targetColor_z * 1.5 ); + } +} // compute the current base ambient light based on: old color, target color, elapsed time void speaker_zone_ambient::fadeAmbientLight( ) @@ -359,41 +410,16 @@ } } - // Tels: if the "fast ambient" method is used, do not fade the light, or - // it would be turned on and interfere: - if ( sys.getcvar("tdm_ambient_method") == "0") - { - // this call will do nothing if the light is already at the right color - // fade the light until we update it next: - // bug #2326: if m_al_fade_time is shorter than m_updatePeriod, use it instead - float f_time = m_updatePeriod; - if (m_al_fade_time < f_time) - { - f_time = m_al_fade_time; - } - //sys.print( "Fading light to '" + m_al_base); - //sys.print( "' plus '" + m_al_dynamic ); - //sys.print( "' in '" + f_time + "' seconds.\n"); - - // grayman #3132 - retrieve the main ambient light - entity ambientWorld = sys.getMainAmbientLight(); - if ( ambientWorld != $null_entity ) - { - ambientWorld.fadeToLight( m_al_base + m_al_dynamic, f_time ); - } - } - else - { - // C++ code has this: - // gameLocal.globalShaderParms[2] = ambient_color.x * 1.5f; - // gameLocal.globalShaderParms[3] = ambient_color.y * 1.5f; - // gameLocal.globalShaderParms[4] = ambient_color.z * 1.5f; - // so do the same here: - vector al_combined = m_al_base + m_al_dynamic; - sys.setShaderParm( 2, al_combined_x * 1.5 ); - sys.setShaderParm( 3, al_combined_y * 1.5 ); - sys.setShaderParm( 4, al_combined_z * 1.5 ); - } + // bug #2326: if m_al_fade_time is shorter than m_updatePeriod, use it instead + float f_time = m_updatePeriod; + if (m_al_fade_time < f_time) + { + f_time = m_al_fade_time; + } + //sys.print( "Fading light to '" + m_al_base); + //sys.print( "' plus '" + m_al_dynamic ); + //sys.print( "' in '" + f_time + "' seconds.\n"); + fadeAmbientLightColor( m_al_base + m_al_dynamic, f_time ); /* sys.print( "Old ambient light is: '" + m_al_base_old + "'. \n" ); sys.print( "New target ambient light is: '" + m_al_base_target + "'. \n" ); @@ -415,11 +441,30 @@ // bug #2326 if (locEnt == $null_entity) { + if (!m_invalid_zone) + { + // Tels: #3694: when first entering an invalid zone, fade the ambient light back to the default value + sys.println("Entered invalid zone - missing no info_location entity!\n Setting ambient light:" + m_al_default_color); + m_invalid_zone = true; + m_al_dynamic = '0 0 0'; + m_al_dynamic_old = '0 0 0'; + m_al_base = m_al_default_color; + m_al_base_target = m_al_default_color; + fadeAmbientLightColor( m_al_default_color, m_updatePeriod * 2 ); // avoid too abrupt changes + // TODO: fade out music? + } // invalid zone, wait and try again wait( m_updatePeriod ); continue; } + if (m_invalid_zone) + { + sys.println("Left invalid zone, entered " + locEnt.getName()); + // TODO: fade music in again if we faded it out? + m_invalid_zone = false; + } + // sys.println( "Ambient script check, music_volume " + music_volume + " in location " + locEnt.getName() ); // now fade the ambient light until the next update | ||||
The attached patch implements a "no_ambient_light_fade" spawnarg on both the location settings and the info_location entities. The attached map demos the new feature. Here is more info: http://forums.thedarkmod.com/topic/16511-my-patches-and-contribution/page__view__findpost__p__354894 |
|
Attached is another patch (_j_) which fixes the issue with starting in a location with "no_ambient_light_fade". It also fixes 3694 (entering an invalid zone) and also breaks out the actual "light update" into its own routine, so it an be re-used. The attched tdm_location_settings.script is the version with both patches applied. The new testmap is at bug 3694 - the only difference to this map is the invalid zone in the red area to the far right (from the player start). |
|
Work around is to manually set "ambient_light_dynamic" to 0 0 0 on all info_location entities in the map. | |
Still has latern fixes that might be useful... Suspended. |
|
Date Modified | Username | Field | Change |
---|---|---|---|
22.09.2014 11:01 | tels | New Issue | |
22.09.2014 11:02 | tels | File Added: ambient_fade_test.pk4 | |
22.09.2014 11:02 | tels | File Added: tels_patch_i_ambient_fade_2014-09-22.txt | |
22.09.2014 11:03 | tels | Note Added: 0007027 | |
22.09.2014 11:04 | tels | Relationship added | related to 0002901 |
22.09.2014 12:21 | tels | Relationship added | related to 0003694 |
22.09.2014 12:22 | tels | File Added: tels_patch_j_ambient_fade_2014-09-22.txt | |
22.09.2014 12:23 | tels | File Added: tdm_location_settings.script | |
22.09.2014 12:25 | tels | Note Added: 0007030 | |
28.03.2018 09:28 |
|
Note Added: 0010193 | |
28.03.2018 09:29 |
|
Status | new => closed |
28.03.2018 09:29 |
|
Assigned To | => user81 |
28.03.2018 09:29 |
|
Resolution | open => fixed |
28.03.2018 09:29 |
|
Fixed in Version | => TDM 2.06 |
25.04.2018 05:23 | nbohr1more | Status | closed => suspended |
25.04.2018 05:23 | nbohr1more | Resolution | fixed => suspended |
25.04.2018 05:23 | nbohr1more | Fixed in Version | TDM 2.06 => |
25.04.2018 05:24 | nbohr1more | Note Added: 0010397 | |
22.12.2018 09:42 |
|
Assigned To | user81 => |