Advertisement
Guest User

modMarkers.ws

a guest
Jan 16th, 2018
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 80.42 KB | None | 0 0
  1. //---=== modFriendlyHUD ===---
  2. struct SMod3DMarker
  3. {
  4. var visibleType : name; //map pin visible type
  5. var isDiscovered : bool; //is discovered
  6. var isKnown : bool; //is known
  7. var isDisabled : bool; //is disabled
  8. var isHighlighted : bool; //is active quest objective
  9. var isActiveQuest : bool; //is active quest
  10. var lvlDiff : EQuestLevel; //player - quest lvl diff
  11. var description : string; //map pin short description (quest name, merchant type, etc)
  12. var position : Vector; //map pin world position
  13. var distance : float; //distance from player
  14. var text : string; //text/icon to display
  15. //three oneliners per marker seems excessive, but it's the only way to avoid flickering
  16. var onelinerID : int; //oneliner ID
  17. var distOnelinerID : int; //distance text oneliner ID
  18. var descrOnelinerID : int; //description text oneliner ID
  19. var screenPosition : Vector; //screen position
  20. var onScreen : bool; //is on screen
  21. var offscreenText : string; //text/icon to display if offscreen
  22. //display conditions
  23. var force : bool; //force show marker (respects max distance, ignores visibility)
  24. var pin : bool; //pin marker (ignores max distance, respects visibility)
  25. };
  26.  
  27. enum EMarkersDisplayMode
  28. {
  29. MDM_WS,
  30. MDM_Always,
  31. MDM_Never
  32. };
  33.  
  34. enum EMarkersIconType
  35. {
  36. MIT_Icon,
  37. MIT_Icon_bw,
  38. MIT_Text,
  39. MIT_Text_bw
  40. };
  41.  
  42. enum EMarkersVisibility
  43. {
  44. MV_Show,
  45. MV_Hide,
  46. MV_Pin,
  47. MV_Force
  48. };
  49.  
  50. enum EQuestLevel
  51. {
  52. QL_NORMAL,
  53. QL_HIGH,
  54. QL_LOW
  55. };
  56.  
  57. //this event triggers when map pin entity gets changed, like noticeboard changing from full
  58. //to empty; undiscovered pin changing to discovered, etc.
  59. //it's not triggered when quest is activated/deactivated or when user map pin is added
  60. class CModMarkersListener extends IGlobalEventScriptedListener
  61. {
  62. event OnGlobalEventName( eventCategory : EGlobalEventCategory, eventType : EGlobalEventType, eventParam : name )
  63. {
  64. if( eventCategory == GetGlobalEventCategory( SEC_OnMapPinChanged ) )
  65. {
  66. //theGame.witcherLog.AddMessage( "OnMapPinChanged" );
  67. Mod3DMarkersSignalCache3DMarkers( true );
  68. }
  69. }
  70. }
  71.  
  72. class CModMarkers
  73. {
  74. var config : CModFriendlyHUDConfig;
  75. var hud : CR4ScriptedHud;
  76. var module : CR4HudModuleOneliners;
  77.  
  78. var bIconCurrentlyShown : bool; default bIconCurrentlyShown = false;
  79. var bAltTextCurrentlyShown : bool; default bAltTextCurrentlyShown = false;
  80. var bDescriptionCurrentlyShown : bool; default bDescriptionCurrentlyShown = false;
  81. var bDistanceCurrentlyShown : bool; default bDistanceCurrentlyShown = false;
  82. var bCompassCurrentlyShown : bool; default bCompassCurrentlyShown = false;
  83.  
  84. var isIconFadingOut : bool; default isIconFadingOut = false;
  85. var isDescriptionFadingOut : bool; default isDescriptionFadingOut = false;
  86. var isDistanceFadingOut : bool; default isDistanceFadingOut = false;
  87. var isCompassFadingOut : bool; default isCompassFadingOut = false;
  88.  
  89. var iconFadeOutTime : float;
  90. var descriptionFadeOutTime : float;
  91. var distanceFadeOutTime : float;
  92. var compassFadeOutTime : float;
  93.  
  94. var marginCenter : Vector;
  95. var marginLeftTop : Vector;
  96. var marginRightBottom : Vector;
  97.  
  98. var timeDelta : float;
  99.  
  100. var onelinersMaxID : int; default onelinersMaxID = -1;
  101. var prevOnelinersMaxID : int; default prevOnelinersMaxID = -1;
  102.  
  103. const var MARKERS_START_ID : int; default MARKERS_START_ID = 100500;
  104. const var MARKERS_END_ID : int; default MARKERS_END_ID = 100899;
  105. const var COMPASS_START_ID : int; default COMPASS_START_ID = 100900;
  106. const var COMPASS_END_ID : int; default COMPASS_END_ID = 100909;
  107.  
  108. var projOffset, descrOffset, distOffset : float;
  109.  
  110. var cached3DMarkers : array< SMod3DMarker >;
  111. var cachedQuestPins : array< SCommonMapPinInstance >;
  112. var cachedQuestLevels : array< EQuestLevel >;
  113. var cachedWorldPath : string;
  114. var cachedNumPins : int;
  115. var isDirty : bool; default isDirty = false;
  116. var cacheQuestPins : bool; default cacheQuestPins = false;
  117. var delayedCacheTime : float;
  118. var compassLocs : array< Vector >;
  119.  
  120.  
  121. public function Init()
  122. {
  123. config = GetFHUDConfig();
  124. hud = (CR4ScriptedHud)theGame.GetHud();
  125. module = (CR4HudModuleOneliners)(hud.GetHudModule( "OnelinersModule" ));
  126. marginCenter = hud.GetScaleformPoint( 0.5, 0.5 );
  127. marginLeftTop = hud.GetScaleformPoint( 0.01, 0.025 );
  128. marginRightBottom = hud.GetScaleformPoint( 1 - 0.01, 1 - 0.01 );
  129. theGame.GetGlobalEventsManager().AddListener( GetGlobalEventCategory( SEC_OnMapPinChanged ), new CModMarkersListener in this );
  130. //cache all markers
  131. cacheQuestPins = true;
  132. Cache3DMarkers();
  133. //init compass marks
  134. FillCompassLocs();
  135. }
  136.  
  137. public function Update( dt : float )
  138. {
  139. timeDelta = dt;
  140. //theGame.witcherLog.AddMessage( "timeDelta = " + timeDelta );
  141. if( !theGame.GetGuiManager().IsAnyMenu() )
  142. {
  143. if( config.compassMarkersEnabled )
  144. {
  145. UpdateCompass();
  146. }
  147. else
  148. {
  149. CleanupCompassOneliners();
  150. bCompassCurrentlyShown = false;
  151. }
  152. if( config.b3DMarkersEnabled )
  153. {
  154. Update3DMarkers();
  155. }
  156. else
  157. {
  158. CleanupOneliners();
  159. bIconCurrentlyShown = false;
  160. bAltTextCurrentlyShown = false;
  161. bDescriptionCurrentlyShown = false;
  162. bDistanceCurrentlyShown = false;
  163. }
  164. }
  165. }
  166.  
  167. public function IsValidID( ID : int ) : bool
  168. {
  169. return IsMarkerID( ID ) || IsCompassID( ID );
  170. }
  171.  
  172. function IsMarkerID( ID : int ) : bool
  173. {
  174. return ( ID >= MARKERS_START_ID && ID <= MARKERS_END_ID );
  175. }
  176.  
  177. function IsCompassID( ID : int ) : bool
  178. {
  179. return ( ID >= COMPASS_START_ID && ID <= COMPASS_END_ID );
  180. }
  181.  
  182. function CleanupOneliners()
  183. {
  184. var i : int;
  185. for( i = MARKERS_START_ID; i < prevOnelinersMaxID; i += 1 )
  186. module.FXRemoveOneliner( i );
  187. }
  188.  
  189. function CleanupCompassOneliners()
  190. {
  191. module.FXRemoveOneliner( COMPASS_START_ID );
  192. module.FXRemoveOneliner( COMPASS_START_ID + 1 );
  193. module.FXRemoveOneliner( COMPASS_START_ID + 2 );
  194. module.FXRemoveOneliner( COMPASS_START_ID + 3 );
  195. module.FXRemoveOneliner( COMPASS_START_ID + 4 );
  196. module.FXRemoveOneliner( COMPASS_START_ID + 5 );
  197. module.FXRemoveOneliner( COMPASS_START_ID + 6 );
  198. module.FXRemoveOneliner( COMPASS_START_ID + 7 );
  199. module.FXRemoveOneliner( COMPASS_START_ID + 8 );
  200. module.FXRemoveOneliner( COMPASS_START_ID + 9 );
  201. }
  202.  
  203. function ShouldShowIcon() : bool
  204. {
  205. if( config.forceShowMarkers || config.markerIconDisplayMode == MDM_Always ||
  206. config.markerIconDisplayMode == MDM_WS && theGame.GetFocusModeController().IsActive() )
  207. {
  208. isIconFadingOut = false;
  209. return true;
  210. }
  211. if( isIconFadingOut && iconFadeOutTime > 0 )
  212. {
  213. iconFadeOutTime -= timeDelta;
  214. return true;
  215. }
  216. if( bIconCurrentlyShown && !isIconFadingOut )
  217. {
  218. isIconFadingOut = true;
  219. iconFadeOutTime = config.markersFadeOutDelay;
  220. return true;
  221. }
  222. isIconFadingOut = false;
  223. return false;
  224. }
  225.  
  226. function ShouldShowDescription() : bool
  227. {
  228. if( config.forceShowMarkers || config.markerDescriptionDisplayMode == MDM_Always ||
  229. config.markerDescriptionDisplayMode == MDM_WS && theGame.GetFocusModeController().IsActive() )
  230. {
  231. isDescriptionFadingOut = false;
  232. return true;
  233. }
  234. if( isDescriptionFadingOut && descriptionFadeOutTime > 0 )
  235. {
  236. descriptionFadeOutTime -= timeDelta;
  237. return true;
  238. }
  239. if( bDescriptionCurrentlyShown && !isDescriptionFadingOut )
  240. {
  241. isDescriptionFadingOut = true;
  242. descriptionFadeOutTime = config.markersFadeOutDelay;
  243. return true;
  244. }
  245. isDescriptionFadingOut = false;
  246. return false;
  247. }
  248.  
  249. function ShouldShowDistance() : bool
  250. {
  251. if( config.forceShowMarkers || config.markerDistanceDisplayMode == MDM_Always ||
  252. config.markerDistanceDisplayMode == MDM_WS && theGame.GetFocusModeController().IsActive() )
  253. {
  254. isDistanceFadingOut = false;
  255. return true;
  256. }
  257. if( isDistanceFadingOut && distanceFadeOutTime > 0 )
  258. {
  259. distanceFadeOutTime -= timeDelta;
  260. return true;
  261. }
  262. if( bDistanceCurrentlyShown && !isDistanceFadingOut )
  263. {
  264. isDistanceFadingOut = true;
  265. distanceFadeOutTime = config.markersFadeOutDelay;
  266. return true;
  267. }
  268. isDistanceFadingOut = false;
  269. return false;
  270. }
  271.  
  272. function ShouldShowCompass() : bool
  273. {
  274. if( config.forceShowMarkers || config.markerCompassDisplayMode == MDM_Always ||
  275. config.markerCompassDisplayMode == MDM_WS && theGame.GetFocusModeController().IsActive() )
  276. {
  277. isCompassFadingOut = false;
  278. return true;
  279. }
  280. if( isCompassFadingOut && compassFadeOutTime > 0 )
  281. {
  282. compassFadeOutTime -= timeDelta;
  283. return true;
  284. }
  285. if( bCompassCurrentlyShown && !isCompassFadingOut )
  286. {
  287. isCompassFadingOut = true;
  288. compassFadeOutTime = config.markersFadeOutDelay;
  289. return true;
  290. }
  291. isCompassFadingOut = false;
  292. return false;
  293. }
  294.  
  295. //======================= update compass ==========================
  296.  
  297. function UpdateCompass()
  298. {
  299. var i : int;
  300.  
  301. if( ShouldShowCompass() )
  302. {
  303. for( i = 0; i <= 7; i += 1 )
  304. {
  305. UpdateCompassScreenPosition( COMPASS_START_ID + i );
  306. }
  307. bCompassCurrentlyShown = true;
  308. }
  309. else
  310. {
  311. CleanupCompassOneliners();
  312. bCompassCurrentlyShown = false;
  313. }
  314. }
  315.  
  316. function FillCompassLocs()
  317. {
  318. compassLocs.Resize(8);
  319. compassLocs[0].X -= 100; compassLocs[0].Y += 100; // NW
  320. compassLocs[1].Y += 100; // N
  321. compassLocs[2].X += 100; compassLocs[2].Y += 100; // NE
  322. compassLocs[3].X -= 100; // W
  323. compassLocs[4].X += 100; // E
  324. compassLocs[5].X -= 100; compassLocs[5].Y -= 100; // SW
  325. compassLocs[6].Y -= 100; // S
  326. compassLocs[7].X += 100; compassLocs[7].Y -= 100; // SE
  327. }
  328.  
  329. function GetCompassLoc( ID : int ) : Vector
  330. {
  331. return compassLocs[ID - COMPASS_START_ID] + thePlayer.GetWorldPosition();
  332. }
  333.  
  334. function GetLocHeading( ID : int ) : float
  335. {
  336. return VecHeading( compassLocs[ID - COMPASS_START_ID] );
  337. }
  338.  
  339. function UpdateCompassScreenPosition( ID : int )
  340. {
  341. var oppositeCamera : bool;
  342. var screenPos : Vector;
  343. var mcOneliner : CScriptedFlashSprite;
  344. var text : string;
  345. var camHeading : float = VecHeading( theCamera.GetCameraDirection() );
  346. var loc : Vector;
  347.  
  348. loc = GetCompassLoc( ID );
  349. text = GetCompassText( ID );
  350. oppositeCamera = GetScreenPosOpposite( screenPos, loc );
  351. screenPos.Y = (marginRightBottom.Y - marginLeftTop.Y) * config.compassScreenPosY;
  352. //marker is not visible normally
  353. if( text != "" && ( oppositeCamera || !IsInsideMargins( screenPos ) ) )
  354. {
  355. //icons only
  356. if( ( config.markerIconType == MIT_Icon || config.markerIconType == MIT_Icon_bw ) && AbsF( AngleDistance( camHeading, GetLocHeading( ID ) ) ) < 130 )
  357. {
  358. if( screenPos.X <= marginLeftTop.X || oppositeCamera && screenPos.X <= marginCenter.X )
  359. {
  360. text = "<img src=\"img://icons/quests/arrow_left.png\" width=\"" + GetArrowSize() + "\" height=\"" + GetIconSize() + "\">" + GetCompassIcon60( ID );
  361. screenPos.X = marginLeftTop.X + (GetIconSize() + GetArrowSize() )/2;
  362. }
  363. else if( screenPos.X >= marginRightBottom.X || oppositeCamera && screenPos.X >= marginCenter.X )
  364. {
  365. text = GetCompassIcon60( ID ) + "<img src=\"img://icons/quests/arrow_right.png\" width=\"" + GetArrowSize() + "\" height=\"" + GetIconSize() + "\">";
  366. screenPos.X = marginRightBottom.X - (GetIconSize() + GetArrowSize() )/2;
  367. }
  368. screenPos.Y -= 0.7*GetIconSize()/2;
  369. }
  370. else
  371. {
  372. text = "";
  373. }
  374. }
  375. mcOneliner = module.FXGetOneliner( ID );
  376. //if has something to display
  377. if( text != "" )
  378. {
  379. if( !mcOneliner || module.FXGetOnelinerText( ID ).GetTextHtml() != text )
  380. {
  381. module.FXRemoveOneliner( ID );
  382. module.FXCreateOneliner( text, ID );
  383. mcOneliner = module.FXGetOneliner( ID );
  384. }
  385. mcOneliner.SetPosition( screenPos.X, screenPos.Y );
  386. mcOneliner.SetVisible( true );
  387. if( isCompassFadingOut )
  388. mcOneliner.SetAlpha( 100 * MaxF( 0, compassFadeOutTime / config.markersFadeOutDelay ) );
  389. else
  390. mcOneliner.SetAlpha( 100 );
  391. }
  392. else
  393. {
  394. if( mcOneliner )
  395. mcOneliner.SetVisible( false );
  396. }
  397. }
  398.  
  399. //=========================== update markers ==========================
  400.  
  401. function InitUserMarker( out userMarker : SMod3DMarker ) : bool
  402. {
  403. var mapManager : CCommonMapManager = theGame.GetCommonMapManager();
  404. var area, numPins, id, type, i : int;
  405. var pinX, pinY : float;
  406.  
  407. numPins = mapManager.GetUserMapPinCount();
  408. for( i = 0; i < numPins; i += 1 )
  409. {
  410. mapManager.GetUserMapPinByIndex( i, id, area, pinX, pinY, type );
  411. if( area == mapManager.GetCurrentArea() && type == 0 )
  412. {
  413. userMarker.visibleType = 'User1';
  414. userMarker.position.X = pinX;
  415. userMarker.position.Y = pinY;
  416. return true;
  417. }
  418. }
  419. return false;
  420. }
  421.  
  422. function Update3DMarkers()
  423. {
  424. var commonMapManager : CCommonMapManager = theGame.GetCommonMapManager();
  425. var currentWorldPath : string = theGame.GetWorld().GetDepotPath();
  426. var mapPinInstances : array< SCommonMapPinInstance >;
  427. var playerPosition : Vector = thePlayer.GetWorldPosition();
  428. var markersCount : int;
  429. var i : int;
  430. var marker, userMarker : SMod3DMarker;
  431. var hasUserMarker, userMarkerSubstituted, showUser, isUser : bool;
  432.  
  433. if( isDirty && delayedCacheTime - theGame.GetEngineTimeAsSeconds() <= 0 )
  434. {
  435. Cache3DMarkers();
  436. }
  437. else
  438. {
  439. mapPinInstances = commonMapManager.GetMapPinInstances( currentWorldPath );
  440. //if world path has changed or markers have changed
  441. if( mapPinInstances.Size() != cachedNumPins || currentWorldPath != cachedWorldPath )
  442. {
  443. //theGame.witcherLog.AddMessage( "Map pins changed, caching markers." );
  444. //if world path has changed, cache everything, if not - only cache map pin entities
  445. if( currentWorldPath != cachedWorldPath )
  446. cacheQuestPins = true;
  447. Cache3DMarkers();
  448. }
  449. }
  450.  
  451. //get main user map pin
  452. hasUserMarker = InitUserMarker( userMarker );
  453. userMarkerSubstituted = false;
  454.  
  455. markersCount = cached3DMarkers.Size();
  456.  
  457. prevOnelinersMaxID = onelinersMaxID;
  458. onelinersMaxID = MARKERS_START_ID;
  459.  
  460. UpdateShownVars();
  461. InitOnelinersOffsets();
  462.  
  463. for( i = 0; i < markersCount; i += 1 )
  464. {
  465. marker = cached3DMarkers[i];
  466.  
  467. //skip unknown markers
  468. if( !marker.isDiscovered && !marker.isKnown )
  469. {
  470. if( !IsRoadSign( marker ) || !config.markerShowUndiscoveredRoadsigns )
  471. continue;
  472. }
  473.  
  474. //always skip disabled quest map pins
  475. if( marker.isDisabled && IsQuest( marker ) )
  476. continue;
  477.  
  478. //other disabled pins use menu setting
  479. if( marker.isDisabled && !config.markersShowDisabled )
  480. continue;
  481.  
  482. marker.distance = VecDistance( playerPosition, marker.position );
  483.  
  484. if( marker.distance < config.markerMinDistance )
  485. continue;
  486.  
  487. isUser = IsUserMain( marker );
  488.  
  489. //user pinned markers ignore both visibility and max distance settings
  490. if( !isUser && hasUserMarker && !userMarkerSubstituted && VecDistance2D( marker.position, userMarker.position ) <= 4.f )
  491. {
  492. userMarkerSubstituted = true;
  493. marker.force = true;
  494. marker.pin = true;
  495. }
  496. else
  497. {
  498. marker.force = ShouldForceMarker( marker );
  499. marker.pin = ShouldPinMarker( marker );
  500. }
  501.  
  502. //if marker isn't pinned, check for max dist
  503. if( !marker.pin && marker.distance > config.markerMaxDistance )
  504. continue;
  505.  
  506. if( !ShouldShowMarker( marker ) )
  507. continue;
  508.  
  509. //is inside quest zone
  510. /*if( marker.isHighlighted && marker.distance < mapPin.visibleRadius )
  511. {
  512. CleanupCurrentOneliners();
  513. break;
  514. }*/
  515.  
  516. AdjustZLevel( marker );
  517.  
  518. if( !isUser )
  519. UpdateMarker( marker );
  520. else
  521. {
  522. userMarker = marker;
  523. showUser = true;
  524. }
  525. }
  526.  
  527. if( showUser && !userMarkerSubstituted )
  528. UpdateMarker( userMarker );
  529.  
  530. CleanupUnusedOneliners();
  531. }
  532.  
  533. function AdjustZLevel( out marker : SMod3DMarker )
  534. {
  535. var playerPosition : Vector;
  536.  
  537. switch( marker.visibleType )
  538. {
  539. case 'User1':
  540. case 'User2':
  541. case 'User3':
  542. case 'User4':
  543. playerPosition = thePlayer.GetWorldPosition();
  544. marker.position.Z = playerPosition.Z + 0.5;
  545. return;
  546. case 'MagicLamp':
  547. case 'HorseRaceTarget':
  548. case 'EnemyDead':
  549. case 'GenericFocus':
  550. marker.position.Z += 0.5;
  551. return;
  552. }
  553. marker.position.Z += 2.5;
  554. }
  555.  
  556. function CleanupCurrentOneliners()
  557. {
  558. var i : int;
  559. for( i = MARKERS_START_ID; i < onelinersMaxID; i += 1 )
  560. module.FXRemoveOneliner( i );
  561. bIconCurrentlyShown = false;
  562. bAltTextCurrentlyShown = false;
  563. bDescriptionCurrentlyShown = false;
  564. bDistanceCurrentlyShown = false;
  565. }
  566.  
  567. function CleanupUnusedOneliners()
  568. {
  569. var i : int;
  570. for( i = onelinersMaxID; i < prevOnelinersMaxID; i += 1 )
  571. module.FXRemoveOneliner( i );
  572. }
  573.  
  574. function UpdateShownVars()
  575. {
  576. if( ShouldShowIcon() )
  577. {
  578. bIconCurrentlyShown = true;
  579. bAltTextCurrentlyShown = ( config.markerIconType == MIT_Text || config.markerIconType == MIT_Text_bw );
  580. }
  581. else
  582. {
  583. bIconCurrentlyShown = false;
  584. bAltTextCurrentlyShown = false;
  585. }
  586. if( ShouldShowDescription() )
  587. bDescriptionCurrentlyShown = true;
  588. else
  589. bDescriptionCurrentlyShown = false;
  590. if( ShouldShowDistance() )
  591. bDistanceCurrentlyShown = true;
  592. else
  593. bDistanceCurrentlyShown = false;
  594. }
  595.  
  596. function UpdateMarker( out marker : SMod3DMarker )
  597. {
  598. var markerText : string = "";
  599. var markerDescrText : string = "";
  600. var markerDistanceText : string = "";
  601. var onelinerTextFlash : CScriptedFlashTextField;
  602. var mcOneliner : CScriptedFlashSprite;
  603.  
  604. /*markerText = "id: " + pin.id
  605. + " tag: " + pin.tag
  606. + " customNameId: " + pin.customNameId
  607. + " extraTag: " + pin.extraTag
  608. + " type: " + pin.type
  609. + " visibleType: " + pin.visibleType
  610. + " alternateVersion: " + pin.alternateVersion;*/
  611. //theGame.witcherLog.AddMessage("size = " + GetIconSize());
  612.  
  613. marker.text = GetMarkerIconByType( marker );
  614.  
  615. SetMarkerScreenPosition( marker );
  616.  
  617. if( bIconCurrentlyShown || marker.force )
  618. {
  619. if( marker.onScreen )
  620. markerText = marker.text;
  621. else
  622. markerText = marker.offscreenText;
  623. marker.onelinerID = onelinersMaxID;
  624. onelinersMaxID += 1;
  625. mcOneliner = module.FXGetOneliner( marker.onelinerID );
  626. if( mcOneliner )
  627. module.FXRemoveOneliner( marker.onelinerID );
  628. module.FXCreateOneliner( markerText, marker.onelinerID );
  629. }
  630. else
  631. {
  632. marker.onelinerID = 0;
  633. }
  634.  
  635. if( bDescriptionCurrentlyShown && marker.onScreen )
  636. {
  637. markerDescrText = "<font" + GetDescriptionFont() + ">" + marker.description + "</font>";
  638. marker.descrOnelinerID = onelinersMaxID;
  639. onelinersMaxID += 1;
  640. mcOneliner = module.FXGetOneliner( marker.descrOnelinerID );
  641. if( mcOneliner )
  642. module.FXRemoveOneliner( marker.descrOnelinerID );
  643. module.FXCreateOneliner( markerDescrText, marker.descrOnelinerID );
  644. }
  645. else
  646. {
  647. marker.descrOnelinerID = 0;
  648. }
  649.  
  650. if( bDistanceCurrentlyShown && marker.onScreen )
  651. {
  652. markerDistanceText = GetMarkerDistanceText( marker );
  653. marker.distOnelinerID = onelinersMaxID;
  654. onelinersMaxID += 1;
  655. mcOneliner = module.FXGetOneliner( marker.distOnelinerID );
  656. if( mcOneliner )
  657. module.FXRemoveOneliner( marker.distOnelinerID );
  658. module.FXCreateOneliner( markerDistanceText, marker.distOnelinerID );
  659. }
  660. else
  661. {
  662. marker.distOnelinerID = 0;
  663. }
  664.  
  665. UpdateMarkerOneliner( marker );
  666. }
  667.  
  668. function SetMarkerScreenPosition( out marker : SMod3DMarker )
  669. {
  670. var shouldProject : bool;
  671. var noOppositeCamera : bool;
  672. var onScreen : bool;
  673. var screenPos : Vector;
  674.  
  675. shouldProject = config.compassMarkersEnabled && config.project3DMarkersOnCompass;
  676. noOppositeCamera = ( shouldProject || config.markerOnScreenOnly );
  677. onScreen = GetScreenPos( screenPos, marker.position, noOppositeCamera );
  678. marker.offscreenText = "";
  679. if( !IsInsideMargins( screenPos ) )
  680. onScreen = false;
  681. if( onScreen )
  682. {
  683. if( shouldProject )
  684. screenPos.Y = (marginRightBottom.Y - marginLeftTop.Y) * config.compassScreenPosY + projOffset;
  685. }
  686. else if( !noOppositeCamera )
  687. {
  688. if( screenPos.X <= marginLeftTop.X )
  689. {
  690. if( config.markerIconType == MIT_Icon || config.markerIconType == MIT_Icon_bw )
  691. {
  692. marker.offscreenText = "<img src=\"img://icons/quests/arrow_left.png\" width=\"" + GetArrowSize() + "\" height=\"" + GetIconSize() + "\">" + marker.text;
  693. screenPos.X = marginLeftTop.X + (GetIconSize() + GetArrowSize() )/2;
  694. }
  695. else
  696. {
  697. marker.offscreenText = "<font size=\"" + config.markersAltTextSize + "\">&lt;</font>" + marker.text;
  698. screenPos.X = marginLeftTop.X + config.markersAltTextSize;
  699. }
  700. }
  701. else if( screenPos.X >= marginRightBottom.X )
  702. {
  703. if( config.markerIconType == MIT_Icon || config.markerIconType == MIT_Icon_bw )
  704. {
  705. marker.offscreenText = marker.text + "<img src=\"img://icons/quests/arrow_right.png\" width=\"" + GetArrowSize() + "\" height=\"" + GetIconSize() + "\">";
  706. screenPos.X = marginRightBottom.X - (GetIconSize() + GetArrowSize() )/2;
  707. }
  708. else
  709. {
  710. marker.offscreenText = marker.text + "<font size=\"" + config.markersAltTextSize + "\">></font>";
  711. screenPos.X = marginRightBottom.X - config.markersAltTextSize;
  712. }
  713. }
  714. else if( screenPos.Y <= marginLeftTop.Y )
  715. {
  716. if( config.markerIconType == MIT_Icon || config.markerIconType == MIT_Icon_bw )
  717. {
  718. marker.offscreenText = "<img src=\"img://icons/quests/arrow_up.png\" width=\"" + GetArrowSize() + "\" height=\"" + GetArrowSize() + "\">" + "<br>" + marker.text;
  719. screenPos.Y = marginLeftTop.Y + GetIconSize();
  720. }
  721. else
  722. {
  723. marker.offscreenText = "<font size=\"" + config.markersAltTextSize + "\">^</font><br>" + marker.text;
  724. screenPos.Y = marginLeftTop.Y + 1.5 * config.markersAltTextSize;
  725. }
  726. }
  727. else
  728. {
  729. if( config.markerIconType == MIT_Icon || config.markerIconType == MIT_Icon_bw )
  730. {
  731. marker.offscreenText = marker.text + "<br>" + "<img src=\"img://icons/quests/arrow_down.png\" width=\"" + GetArrowSize() + "\" height=\"" + GetArrowSize() + "\">";
  732. screenPos.Y = marginRightBottom.Y;
  733. }
  734. else
  735. {
  736. marker.offscreenText = marker.text + "<br><font size=\"" + config.markersAltTextSize + "\">v</font>";
  737. screenPos.Y = marginRightBottom.Y;
  738. }
  739. }
  740. }
  741. marker.onScreen = onScreen;
  742. marker.screenPosition = screenPos;
  743. }
  744.  
  745. function UpdateMarkerOneliner( out marker : SMod3DMarker )
  746. {
  747. var noOppositeCamera : bool;
  748. var mcOneliner : CScriptedFlashSprite;
  749.  
  750. noOppositeCamera = ( config.compassMarkersEnabled && config.project3DMarkersOnCompass || config.markerOnScreenOnly );
  751. if( marker.onelinerID )
  752. {
  753. mcOneliner = module.FXGetOneliner( marker.onelinerID );
  754. if( marker.onScreen || !noOppositeCamera )
  755. {
  756. mcOneliner.SetPosition( marker.screenPosition.X, marker.screenPosition.Y );
  757. mcOneliner.SetVisible( true );
  758. if( isIconFadingOut && !marker.force )
  759. mcOneliner.SetAlpha( 100 * MaxF( 0, iconFadeOutTime / config.markersFadeOutDelay ) );
  760. else
  761. mcOneliner.SetAlpha( 100 );
  762. }
  763. else
  764. mcOneliner.SetVisible( false );
  765. }
  766. if( marker.descrOnelinerID )
  767. {
  768. mcOneliner = module.FXGetOneliner( marker.descrOnelinerID );
  769. if( marker.onScreen )
  770. {
  771. mcOneliner.SetPosition( marker.screenPosition.X, marker.screenPosition.Y + descrOffset );
  772. mcOneliner.SetVisible( true );
  773. if( isDescriptionFadingOut )
  774. mcOneliner.SetAlpha( 100 * MaxF( 0, descriptionFadeOutTime / config.markersFadeOutDelay ) );
  775. else
  776. mcOneliner.SetAlpha( 100 );
  777. }
  778. else
  779. mcOneliner.SetVisible( false );
  780. }
  781. if( marker.distOnelinerID )
  782. {
  783. mcOneliner = module.FXGetOneliner( marker.distOnelinerID );
  784. if( marker.onScreen )
  785. {
  786. mcOneliner.SetPosition( marker.screenPosition.X, marker.screenPosition.Y - distOffset );
  787. mcOneliner.SetVisible( true );
  788. if( isDistanceFadingOut )
  789. mcOneliner.SetAlpha( 100 * MaxF( 0, distanceFadeOutTime / config.markersFadeOutDelay ) );
  790. else
  791. mcOneliner.SetAlpha( 100 );
  792. }
  793. else
  794. mcOneliner.SetVisible( false );
  795. }
  796. }
  797.  
  798. function IsInsideMargins( screenPos : Vector ) : bool
  799. {
  800. if( screenPos.X < marginLeftTop.X || screenPos.X > marginRightBottom.X ||
  801. screenPos.Y < marginLeftTop.Y || screenPos.Y > marginRightBottom.Y )
  802. return false;
  803. else
  804. return true;
  805. }
  806.  
  807. function GetScreenPos( out screenPos : Vector, worldPos : Vector, optional noOppositeCamera : bool ) : bool
  808. {
  809. if( !theCamera.WorldVectorToViewRatio( worldPos, screenPos.X, screenPos.Y ) )
  810. {
  811. if( noOppositeCamera )
  812. return false;
  813. GetOppositeCameraScreenPos( worldPos, screenPos.X, screenPos.Y );
  814. }
  815. screenPos.X = ( screenPos.X + 1 ) / 2;
  816. screenPos.Y = ( screenPos.Y + 1 ) / 2;
  817. screenPos = hud.GetScaleformPoint( screenPos.X, screenPos.Y );
  818. return true;
  819. }
  820.  
  821. function GetScreenPosOpposite( out screenPos : Vector, worldPos : Vector ) : bool
  822. {
  823. var oppositeCamera : bool = false;
  824.  
  825. if( !theCamera.WorldVectorToViewRatio( worldPos, screenPos.X, screenPos.Y ) )
  826. {
  827. oppositeCamera = true;
  828. GetOppositeCameraScreenPos( worldPos, screenPos.X, screenPos.Y );
  829. }
  830. screenPos.X = ( screenPos.X + 1 ) / 2;
  831. screenPos.Y = ( screenPos.Y + 1 ) / 2;
  832. screenPos = hud.GetScaleformPoint( screenPos.X, screenPos.Y );
  833. return oppositeCamera;
  834. }
  835.  
  836. //======================= positioning ======================
  837.  
  838. function InitOnelinersOffsets()
  839. {
  840. projOffset = GetProjOffsetY();
  841. descrOffset = GetDescrOnelinerOffset();
  842. distOffset = GetDistanceOnelinerOffset();
  843. }
  844.  
  845. function GetProjOffsetY() : float
  846. {
  847. var z : float = 0;
  848.  
  849. if( bAltTextCurrentlyShown )
  850. z = config.markersAltTextSize;
  851. else if( bIconCurrentlyShown )
  852. z = GetIconSize();
  853. else if( bDistanceCurrentlyShown )
  854. z = config.markersDistanceTextSize;
  855. else if( bDescriptionCurrentlyShown )
  856. z = config.markersDescriptionTextSize;
  857. if( config.markerIconType == MIT_Icon || config.markerIconType == MIT_Icon_bw )
  858. z = (z - GetCompassIconSize())/2;
  859. else
  860. z = (z - config.markersAltTextSize)/2;
  861.  
  862. return z;
  863. }
  864.  
  865. function GetDescrOnelinerOffset() : float
  866. {
  867. var z : float = 0;
  868.  
  869. z = config.markersDescriptionTextSize;
  870. if( bIconCurrentlyShown || bDistanceCurrentlyShown )
  871. z += 5;
  872.  
  873. return z;
  874. }
  875.  
  876. function GetDistanceOnelinerOffset() : float
  877. {
  878. var z : float = 0;
  879.  
  880. if( bAltTextCurrentlyShown )
  881. z += config.markersAltTextSize + 5;
  882. else if( bIconCurrentlyShown )
  883. z += GetIconSize() + 5;
  884.  
  885. return z;
  886. }
  887.  
  888. //========================= font/size ===========================
  889.  
  890. function GetCompassIconSize() : int
  891. {
  892. return 102 * config.markersIconSizePrc / 100;
  893. }
  894.  
  895. function GetArrowSize() : int
  896. {
  897. return 30 * config.markersIconSizePrc / 100;
  898. }
  899.  
  900. function GetIconSize() : int
  901. {
  902. return 60 * config.markersIconSizePrc / 100;
  903. }
  904.  
  905. function GetDistanceFont() : string
  906. {
  907. return " size=\"" + config.markersDistanceTextSize + "\" ";
  908. }
  909.  
  910. function GetDescriptionFont() : string
  911. {
  912. return " size=\"" + config.markersDescriptionTextSize + "\" ";
  913. }
  914.  
  915. function GetCompassFont() : string
  916. {
  917. return " face=\"$BoldFont\" color=\"#008000\" size=\"" + config.markersAltTextSize + "\" ";
  918. }
  919.  
  920. function GetMarkerDistanceText( marker : SMod3DMarker ) : string
  921. {
  922. return "<font" + GetDistanceFont() + ">" + FloatToStringPrec( FloorF( marker.distance ), 0 ) + "</font>";
  923. }
  924.  
  925. //===================== icon/alt text =========================
  926.  
  927. function GetCompassText( ID : int ) : string
  928. {
  929. switch( config.markerIconType )
  930. {
  931. case MIT_Icon:
  932. case MIT_Icon_bw:
  933. return GetCompassIcon( ID );
  934. case MIT_Text:
  935. case MIT_Text_bw:
  936. return GetCompassAltText( ID );
  937. }
  938. return "";
  939. }
  940.  
  941. function GetCompassIcon( ID : int ) : string
  942. {
  943. ID -= COMPASS_START_ID;
  944.  
  945. switch( ID )
  946. {
  947. case 0:
  948. return "";
  949. case 1:
  950. return "<img src=\"img://icons/quests/compass_N.png\" width=\"" + GetCompassIconSize() + "\" height=\"" + GetCompassIconSize() + "\">";
  951. case 2:
  952. return "";
  953. case 3:
  954. return "<img src=\"img://icons/quests/compass_W.png\" width=\"" + GetCompassIconSize() + "\" height=\"" + GetCompassIconSize() + "\">";
  955. case 4:
  956. return "<img src=\"img://icons/quests/compass_E.png\" width=\"" + GetCompassIconSize() + "\" height=\"" + GetCompassIconSize() + "\">";
  957. case 5:
  958. return "";
  959. case 6:
  960. return "<img src=\"img://icons/quests/compass_S.png\" width=\"" + GetCompassIconSize() + "\" height=\"" + GetCompassIconSize() + "\">";
  961. case 7:
  962. return "";
  963. }
  964. return "";
  965. }
  966.  
  967. function GetCompassIcon60( ID : int ) : string
  968. {
  969. ID -= COMPASS_START_ID;
  970.  
  971. switch( ID )
  972. {
  973. case 0:
  974. return "";
  975. case 1:
  976. return "<img src=\"img://icons/quests/compass_N_60.png\" width=\"" + GetIconSize() + "\" height=\"" + GetIconSize() + "\">";
  977. case 2:
  978. return "";
  979. case 3:
  980. return "<img src=\"img://icons/quests/compass_W_60.png\" width=\"" + GetIconSize() + "\" height=\"" + GetIconSize() + "\">";
  981. case 4:
  982. return "<img src=\"img://icons/quests/compass_E_60.png\" width=\"" + GetIconSize() + "\" height=\"" + GetIconSize() + "\">";
  983. case 5:
  984. return "";
  985. case 6:
  986. return "<img src=\"img://icons/quests/compass_S_60.png\" width=\"" + GetIconSize() + "\" height=\"" + GetIconSize() + "\">";
  987. case 7:
  988. return "";
  989. }
  990. return "";
  991. }
  992.  
  993. function GetCompassAltText( ID : int ) : string
  994. {
  995. ID -= COMPASS_START_ID;
  996.  
  997. switch( ID )
  998. {
  999. case 0:
  1000. return "<font" + GetCompassFont() + ">NW</font>";
  1001. case 1:
  1002. return "<font" + GetCompassFont() + ">N</font>";
  1003. case 2:
  1004. return "<font" + GetCompassFont() + ">NE</font>";
  1005. case 3:
  1006. return "<font" + GetCompassFont() + ">W</font>";
  1007. case 4:
  1008. return "<font" + GetCompassFont() + ">E</font>";
  1009. case 5:
  1010. return "<font" + GetCompassFont() + ">SW</font>";
  1011. case 6:
  1012. return "<font" + GetCompassFont() + ">S</font>";
  1013. case 7:
  1014. return "<font" + GetCompassFont() + ">SE</font>";
  1015. }
  1016. return "";
  1017. }
  1018.  
  1019. function GetMarkerIconByType( marker : SMod3DMarker ) : string
  1020. {
  1021. switch( config.markerIconType )
  1022. {
  1023. case MIT_Icon:
  1024. return GetMarkerIcon( marker );
  1025. case MIT_Icon_bw:
  1026. return GetMarkerIconBW( marker );
  1027. case MIT_Text:
  1028. return GetMarkerAltText( marker );
  1029. case MIT_Text_bw:
  1030. return GetMarkerAltTextBW( marker );
  1031. default:
  1032. return "";
  1033. }
  1034. }
  1035.  
  1036. function GetQuestIconByLevel( marker : SMod3DMarker ) : string
  1037. {
  1038. switch( marker.lvlDiff )
  1039. {
  1040. case QL_NORMAL:
  1041. return "\"img://icons/quests/quest_tracked_green.png\"";
  1042. case QL_HIGH:
  1043. return "\"img://icons/quests/quest_tracked_red.png\"";
  1044. case QL_LOW:
  1045. return "\"img://icons/quests/quest_tracked_gray.png\"";
  1046. }
  1047. return "\"img://icons/quests/quest_tracked_white.png\"";
  1048. }
  1049.  
  1050. function GetMarkerIcon( marker : SMod3DMarker ) : string
  1051. {
  1052. var iconPath : string;
  1053.  
  1054. if( marker.isActiveQuest )
  1055. {
  1056. if( marker.isHighlighted )
  1057. iconPath = "<img src=\"img://icons/quests/quest_tracked_orange.png\"";
  1058. else
  1059. iconPath = "<img src=\"img://icons/quests/quest_tracked_orange_sub.png\"";
  1060. }
  1061. else
  1062. {
  1063. switch( marker.visibleType )
  1064. {
  1065. //quests
  1066. case 'QuestReturn':
  1067. iconPath = "<img src=\"img://icons/quests/quest_question_yellow.png\"";
  1068. break;
  1069. case 'MonsterQuest':
  1070. //iconPath = "<img src=\"img://icons/quests/quest_monsterhunt.png\"";
  1071. //break;
  1072. case 'TreasureQuest':
  1073. //iconPath = "<img src=\"img://icons/quests/quest_treasure.png\"";
  1074. //break;
  1075. case 'StoryQuest':
  1076. case 'ChapterQuest':
  1077. case 'SideQuest':
  1078. iconPath = "<img src=" + GetQuestIconByLevel( marker );
  1079. break;
  1080. case 'QuestAvailable':
  1081. iconPath = "<img src=\"img://icons/quests/quest_exclamation_yellow.png\"";
  1082. break;
  1083. case 'QuestAvailableHoS':
  1084. iconPath = "<img src=\"img://icons/quests/quest_exclamation_blue.png\"";
  1085. break;
  1086. case 'QuestAvailableBaW':
  1087. case 'QuestBelgard':
  1088. case 'QuestCoronata':
  1089. case 'QuestVermentino':
  1090. iconPath = "<img src=\"img://icons/quests/quest_exclamation_orange.png\"";
  1091. break;
  1092. case 'HorseRace':
  1093. case 'BoatRace':
  1094. iconPath = "<img src=\"img://icons/quests/quest_horse_race.png\"";
  1095. break;
  1096. //utility signs
  1097. case 'User1':
  1098. iconPath = "<img src=\"img://icons/quests/user1.png\"";
  1099. break;
  1100. case 'User2':
  1101. iconPath = "<img src=\"img://icons/quests/user2.png\"";
  1102. break;
  1103. case 'User3':
  1104. iconPath = "<img src=\"img://icons/quests/user3.png\"";
  1105. break;
  1106. case 'User4':
  1107. iconPath = "<img src=\"img://icons/quests/user4.png\"";
  1108. break;
  1109. case 'Horse':
  1110. iconPath = "<img src=\"img://icons/quests/roach.png\"";
  1111. break;
  1112. case 'Boat':
  1113. iconPath = "<img src=\"img://icons/quests/boat.png\"";
  1114. break;
  1115. case 'RoadSign':
  1116. iconPath = "<img src=\"img://icons/quests/road_sign.png\"";
  1117. break;
  1118. case 'Harbor':
  1119. iconPath = "<img src=\"img://icons/quests/harbor.png\"";
  1120. break;
  1121. case 'Entrance':
  1122. iconPath = "<img src=\"img://icons/quests/cave_entrance.png\"";
  1123. break;
  1124. case 'NoticeBoard':
  1125. iconPath = "<img src=\"img://icons/quests/noticeboard_white.png\"";
  1126. break;
  1127. case 'NoticeBoardFull':
  1128. iconPath = "<img src=\"img://icons/quests/noticeboard_quest.png\"";
  1129. break;
  1130. case 'Whetstone':
  1131. iconPath = "<img src=\"img://icons/quests/whetstone.png\"";
  1132. break;
  1133. case 'ArmorRepairTable':
  1134. iconPath = "<img src=\"img://icons/quests/armor_repair_table.png\"";
  1135. break;
  1136. case 'WitcherHouse':
  1137. iconPath = "<img src=\"img://icons/quests/witcher_house.png\"";
  1138. break;
  1139. case 'AlchemyTable':
  1140. iconPath = "<img src=\"img://icons/quests/alchemy_table.png\"";
  1141. break;
  1142. case 'MutagenDismantle':
  1143. iconPath = "<img src=\"img://icons/quests/mutagen_dismantle.png\"";
  1144. break;
  1145. case 'Stables':
  1146. iconPath = "<img src=\"img://icons/quests/stables.png\"";
  1147. break;
  1148. case 'Bookshelf':
  1149. iconPath = "<img src=\"img://icons/quests/bookshelf.png\"";
  1150. break;
  1151. case 'Bed':
  1152. iconPath = "<img src=\"img://icons/quests/bed.png\"";
  1153. break;
  1154. case 'PlayerStash':
  1155. case 'PlayerStashDiscoverable':
  1156. iconPath = "<img src=\"img://icons/quests/player_stash.png\"";
  1157. break;
  1158. //NPCs
  1159. case 'Cammerlengo':
  1160. iconPath = "<img src=\"img://icons/quests/cammerlengo.png\"";
  1161. break;
  1162. case 'DyeMerchant':
  1163. iconPath = "<img src=\"img://icons/quests/dye_merchant.png\"";
  1164. break;
  1165. case 'WineMerchant':
  1166. iconPath = "<img src=\"img://icons/quests/wine_merchant.png\"";
  1167. break;
  1168. case 'Shopkeeper':
  1169. iconPath = "<img src=\"img://icons/quests/shopkeeper.png\"";
  1170. break;
  1171. case 'Blacksmith':
  1172. iconPath = "<img src=\"img://icons/quests/blacksmith.png\"";
  1173. break;
  1174. case 'Armorer':
  1175. iconPath = "<img src=\"img://icons/quests/armorer.png\"";
  1176. break;
  1177. case 'Archmaster':
  1178. iconPath = "<img src=\"img://icons/quests/archmaster.png\"";
  1179. break;
  1180. case 'Hairdresser':
  1181. iconPath = "<img src=\"img://icons/quests/hairdresser.png\"";
  1182. break;
  1183. case 'Alchemic':
  1184. iconPath = "<img src=\"img://icons/quests/alchemist.png\"";
  1185. break;
  1186. case 'Herbalist':
  1187. iconPath = "<img src=\"img://icons/quests/herbalist.png\"";
  1188. break;
  1189. case 'Innkeeper':
  1190. iconPath = "<img src=\"img://icons/quests/innkeeper.png\"";
  1191. break;
  1192. case 'Enchanter':
  1193. iconPath = "<img src=\"img://icons/quests/enchanter.png\"";
  1194. break;
  1195. case 'Torch':
  1196. iconPath = "<img src=\"img://icons/quests/torch.png\"";
  1197. break;
  1198. case 'Prostitute':
  1199. iconPath = "<img src=\"img://icons/quests/prostitute.png\"";
  1200. break;
  1201. //POIs
  1202. case 'NotDiscoveredPOI':
  1203. iconPath = "<img src=\"img://icons/quests/quest_question_white.png\"";
  1204. break;
  1205. case 'MonsterNest':
  1206. iconPath = "<img src=\"img://icons/quests/monster_nest.png\"";
  1207. break;
  1208. case 'MonsterNestDisabled':
  1209. iconPath = "<img src=\"img://icons/quests/monster_nest_disabled.png\"";
  1210. break;
  1211. case 'InfestedVineyard':
  1212. iconPath = "<img src=\"img://icons/quests/infested_vineyard.png\"";
  1213. break;
  1214. case 'InfestedVineyardDisabled':
  1215. iconPath = "<img src=\"img://icons/quests/infested_vineyard_disabled.png\"";
  1216. break;
  1217. case 'PlaceOfPower':
  1218. iconPath = "<img src=\"img://icons/quests/place_of_power.png\"";
  1219. break;
  1220. case 'PlaceOfPowerDisabled':
  1221. iconPath = "<img src=\"img://icons/quests/place_of_power_disabled.png\"";
  1222. break;
  1223. case 'TreasureHuntMappin':
  1224. iconPath = "<img src=\"img://icons/quests/quest_treasure.png\"";
  1225. break;
  1226. case 'TreasureHuntMappinDisabled':
  1227. iconPath = "<img src=\"img://icons/quests/quest_treasure_disabled.png\"";
  1228. break;
  1229. case 'SpoilsOfWar':
  1230. iconPath = "<img src=\"img://icons/quests/spoils_of_war.png\"";
  1231. break;
  1232. case 'SpoilsOfWarDisabled':
  1233. iconPath = "<img src=\"img://icons/quests/spoils_of_war_disabled.png\"";
  1234. break;
  1235. case 'BanditCamp':
  1236. iconPath = "<img src=\"img://icons/quests/person_in_distress.png\"";
  1237. break;
  1238. case 'BanditCampDisabled':
  1239. iconPath = "<img src=\"img://icons/quests/person_in_distress_disabled.png\"";
  1240. break;
  1241. case 'BanditCampfire':
  1242. iconPath = "<img src=\"img://icons/quests/bandit_camp.png\"";
  1243. break;
  1244. case 'BanditCampfireDisabled':
  1245. iconPath = "<img src=\"img://icons/quests/bandit_camp_disabled.png\"";
  1246. break;
  1247. case 'BossAndTreasure':
  1248. iconPath = "<img src=\"img://icons/quests/guarded_treasure.png\"";
  1249. break;
  1250. case 'BossAndTreasureDisabled':
  1251. iconPath = "<img src=\"img://icons/quests/guarded_treasure_disabled.png\"";
  1252. break;
  1253. case 'Contraband':
  1254. case 'ContrabandShip':
  1255. iconPath = "<img src=\"img://icons/quests/contraband.png\"";
  1256. break;
  1257. case 'ContrabandDisabled':
  1258. case 'ContrabandShipDisabled':
  1259. iconPath = "<img src=\"img://icons/quests/contraband_disabled.png\"";
  1260. break;
  1261. case 'RescuingTown':
  1262. iconPath = "<img src=\"img://icons/quests/rescuing_town.png\"";
  1263. break;
  1264. case 'RescuingTownDisabled':
  1265. iconPath = "<img src=\"img://icons/quests/rescuing_town_disabled.png\"";
  1266. break;
  1267. case 'DungeonCrawl':
  1268. iconPath = "<img src=\"img://icons/quests/dungeon_crawl.png\"";
  1269. break;
  1270. case 'DungeonCrawlDisabled':
  1271. iconPath = "<img src=\"img://icons/quests/dungeon_crawl_disabled.png\"";
  1272. break;
  1273. case 'Hideout':
  1274. iconPath = "<img src=\"img://icons/quests/hansa_hideout.png\"";
  1275. break;
  1276. case 'HideoutDisabled':
  1277. iconPath = "<img src=\"img://icons/quests/hansa_hideout_disabled.png\"";
  1278. break;
  1279. case 'Plegmund':
  1280. iconPath = "<img src=\"img://icons/quests/lebjoda_statue.png\"";
  1281. break;
  1282. case 'PlegmundDisabled':
  1283. iconPath = "<img src=\"img://icons/quests/lebjoda_statue_disabled.png\"";
  1284. break;
  1285. case 'KnightErrant':
  1286. iconPath = "<img src=\"img://icons/quests/knight_errand.png\"";
  1287. break;
  1288. case 'KnightErrantDisabled':
  1289. iconPath = "<img src=\"img://icons/quests/knight_errand_disabled.png\"";
  1290. break;
  1291. case 'WineContract':
  1292. iconPath = "<img src=\"img://icons/quests/wine_contract.png\"";
  1293. break;
  1294. case 'WineContractDisabled':
  1295. iconPath = "<img src=\"img://icons/quests/wine_contract_disabled.png\"";
  1296. break;
  1297. case 'SignalingStake':
  1298. iconPath = "<img src=\"img://icons/quests/bandit_campfire.png\"";
  1299. break;
  1300. case 'SignalingStakeDisabled':
  1301. iconPath = "<img src=\"img://icons/quests/bandit_campfire_disabled.png\"";
  1302. break;
  1303. //misc
  1304. case 'Rift':
  1305. case 'Teleport':
  1306. iconPath = "<img src=\"img://icons/quests/teleport.png\"";
  1307. break;
  1308. case 'MagicLamp':
  1309. iconPath = "<img src=\"img://icons/quests/magic_lamp.png\"";
  1310. break;
  1311. case 'HorseRaceTarget':
  1312. iconPath = "<img src=\"img://icons/quests/horse_race_target.png\"";
  1313. break;
  1314. case 'HorseRaceDummy':
  1315. iconPath = "<img src=\"img://icons/quests/horse_race_dummy.png\"";
  1316. break;
  1317. case 'Herb':
  1318. iconPath = "<img src=\"img://icons/quests/herb.png\"";
  1319. break;
  1320. case 'Enemy':
  1321. iconPath = "<img src=\"img://icons/quests/enemy.png\"";
  1322. break;
  1323. case 'EnemyDead':
  1324. iconPath = "<img src=\"img://icons/quests/dead_body.png\"";
  1325. break;
  1326. case 'GenericFocus':
  1327. iconPath = "<img src=\"img://icons/quests/ws_clue.png\"";
  1328. break;
  1329. default:
  1330. iconPath = "<img src=\"img://icons/quests/quest_question_white.png\"";
  1331. break;
  1332. }
  1333. }
  1334. iconPath += " width=\"" + GetIconSize() + "\" height=\"" + GetIconSize() + "\">";
  1335. return iconPath;
  1336. }
  1337.  
  1338. function GetMarkerIconBW( marker : SMod3DMarker ) : string
  1339. {
  1340. var iconPath : string;
  1341.  
  1342. if( marker.isActiveQuest )
  1343. {
  1344. //if( marker.isHighlighted )
  1345. iconPath = "<img src=\"img://icons/quests/quest_tracked_white.png\"";
  1346. //else
  1347. // iconPath = "<img src=\"img://icons/quests/quest_tracked_white.png\"";
  1348. }
  1349. else
  1350. {
  1351. switch( marker.visibleType )
  1352. {
  1353. //quests
  1354. case 'QuestReturn':
  1355. iconPath = "<img src=\"img://icons/quests/quest_tracked_white.png\"";
  1356. break;
  1357. case 'MonsterQuest':
  1358. //iconPath = "<img src=\"img://icons/quests/quest_monsterhunt_white.png\"";
  1359. //break;
  1360. case 'TreasureQuest':
  1361. //iconPath = "<img src=\"img://icons/quests/quest_treasure_white.png\"";
  1362. //break;
  1363. case 'StoryQuest':
  1364. case 'ChapterQuest':
  1365. case 'SideQuest':
  1366. iconPath = "<img src=\"img://icons/quests/quest_tracked_gray.png\"";
  1367. break;
  1368. case 'QuestAvailable':
  1369. case 'QuestAvailableHoS':
  1370. case 'QuestAvailableBaW':
  1371. case 'QuestBelgard':
  1372. case 'QuestCoronata':
  1373. case 'QuestVermentino':
  1374. iconPath = "<img src=\"img://icons/quests/quest_exclamation_white.png\"";
  1375. break;
  1376. case 'HorseRace':
  1377. case 'BoatRace':
  1378. iconPath = "<img src=\"img://icons/quests/quest_horse_race_white.png\"";
  1379. break;
  1380. //utility signs
  1381. case 'User1':
  1382. iconPath = "<img src=\"img://icons/quests/user1_white.png\"";
  1383. break;
  1384. case 'User2':
  1385. iconPath = "<img src=\"img://icons/quests/user2_white.png\"";
  1386. break;
  1387. case 'User3':
  1388. iconPath = "<img src=\"img://icons/quests/user3_white.png\"";
  1389. break;
  1390. case 'User4':
  1391. iconPath = "<img src=\"img://icons/quests/user4_white.png\"";
  1392. break;
  1393. case 'Horse':
  1394. iconPath = "<img src=\"img://icons/quests/roach_white.png\"";
  1395. break;
  1396. case 'Boat':
  1397. iconPath = "<img src=\"img://icons/quests/boat_white.png\"";
  1398. break;
  1399. case 'RoadSign':
  1400. iconPath = "<img src=\"img://icons/quests/road_sign_white.png\"";
  1401. break;
  1402. case 'Harbor':
  1403. iconPath = "<img src=\"img://icons/quests/harbor_white.png\"";
  1404. break;
  1405. case 'Entrance':
  1406. iconPath = "<img src=\"img://icons/quests/cave_entrance_white.png\"";
  1407. break;
  1408. case 'NoticeBoard':
  1409. iconPath = "<img src=\"img://icons/quests/noticeboard_white.png\"";
  1410. break;
  1411. case 'NoticeBoardFull':
  1412. iconPath = "<img src=\"img://icons/quests/noticeboard_quest_white.png\"";
  1413. break;
  1414. case 'Whetstone':
  1415. iconPath = "<img src=\"img://icons/quests/whetstone_white.png\"";
  1416. break;
  1417. case 'ArmorRepairTable':
  1418. iconPath = "<img src=\"img://icons/quests/armor_repair_table_white.png\"";
  1419. break;
  1420. case 'WitcherHouse':
  1421. iconPath = "<img src=\"img://icons/quests/witcher_house_white.png\"";
  1422. break;
  1423. case 'AlchemyTable':
  1424. iconPath = "<img src=\"img://icons/quests/alchemy_table_white.png\"";
  1425. break;
  1426. case 'MutagenDismantle':
  1427. iconPath = "<img src=\"img://icons/quests/mutagen_dismantle_white.png\"";
  1428. break;
  1429. case 'Stables':
  1430. iconPath = "<img src=\"img://icons/quests/stables_white.png\"";
  1431. break;
  1432. case 'Bookshelf':
  1433. iconPath = "<img src=\"img://icons/quests/bookshelf_white.png\"";
  1434. break;
  1435. case 'Bed':
  1436. iconPath = "<img src=\"img://icons/quests/bed_white.png\"";
  1437. break;
  1438. case 'PlayerStash':
  1439. case 'PlayerStashDiscoverable':
  1440. iconPath = "<img src=\"img://icons/quests/player_stash_white.png\"";
  1441. break;
  1442. //NPCs
  1443. case 'Cammerlengo':
  1444. iconPath = "<img src=\"img://icons/quests/cammerlengo_white.png\"";
  1445. break;
  1446. case 'DyeMerchant':
  1447. iconPath = "<img src=\"img://icons/quests/dye_merchant_white.png\"";
  1448. break;
  1449. case 'WineMerchant':
  1450. iconPath = "<img src=\"img://icons/quests/wine_merchant_white.png\"";
  1451. break;
  1452. case 'Shopkeeper':
  1453. iconPath = "<img src=\"img://icons/quests/shopkeeper_white.png\"";
  1454. break;
  1455. case 'Blacksmith':
  1456. iconPath = "<img src=\"img://icons/quests/blacksmith_white.png\"";
  1457. break;
  1458. case 'Armorer':
  1459. iconPath = "<img src=\"img://icons/quests/armorer_white.png\"";
  1460. break;
  1461. case 'Archmaster':
  1462. iconPath = "<img src=\"img://icons/quests/archmaster_white.png\"";
  1463. break;
  1464. case 'Hairdresser':
  1465. iconPath = "<img src=\"img://icons/quests/hairdresser_white.png\"";
  1466. break;
  1467. case 'Alchemic':
  1468. iconPath = "<img src=\"img://icons/quests/alchemist_white.png\"";
  1469. break;
  1470. case 'Herbalist':
  1471. iconPath = "<img src=\"img://icons/quests/herbalist_white.png\"";
  1472. break;
  1473. case 'Innkeeper':
  1474. iconPath = "<img src=\"img://icons/quests/innkeeper_white.png\"";
  1475. break;
  1476. case 'Enchanter':
  1477. iconPath = "<img src=\"img://icons/quests/enchanter_white.png\"";
  1478. break;
  1479. case 'Torch':
  1480. iconPath = "<img src=\"img://icons/quests/torch_white.png\"";
  1481. break;
  1482. case 'Prostitute':
  1483. iconPath = "<img src=\"img://icons/quests/prostitute_white.png\"";
  1484. break;
  1485. //POIs
  1486. case 'NotDiscoveredPOI':
  1487. iconPath = "<img src=\"img://icons/quests/quest_question_white.png\"";
  1488. break;
  1489. case 'MonsterNest':
  1490. iconPath = "<img src=\"img://icons/quests/monster_nest_white.png\"";
  1491. break;
  1492. case 'MonsterNestDisabled':
  1493. iconPath = "<img src=\"img://icons/quests/monster_nest_disabled.png\"";
  1494. break;
  1495. case 'InfestedVineyard':
  1496. iconPath = "<img src=\"img://icons/quests/infested_vineyard_white.png\"";
  1497. break;
  1498. case 'InfestedVineyardDisabled':
  1499. iconPath = "<img src=\"img://icons/quests/infested_vineyard_disabled.png\"";
  1500. break;
  1501. case 'PlaceOfPower':
  1502. iconPath = "<img src=\"img://icons/quests/place_of_power_white.png\"";
  1503. break;
  1504. case 'PlaceOfPowerDisabled':
  1505. iconPath = "<img src=\"img://icons/quests/place_of_power_disabled.png\"";
  1506. break;
  1507. case 'TreasureHuntMappin':
  1508. iconPath = "<img src=\"img://icons/quests/quest_treasure_white.png\"";
  1509. break;
  1510. case 'TreasureHuntMappinDisabled':
  1511. iconPath = "<img src=\"img://icons/quests/quest_treasure_disabled.png\"";
  1512. break;
  1513. case 'SpoilsOfWar':
  1514. iconPath = "<img src=\"img://icons/quests/spoils_of_war_white.png\"";
  1515. break;
  1516. case 'SpoilsOfWarDisabled':
  1517. iconPath = "<img src=\"img://icons/quests/spoils_of_war_disabled.png\"";
  1518. break;
  1519. case 'BanditCamp':
  1520. iconPath = "<img src=\"img://icons/quests/person_in_distress_white.png\"";
  1521. break;
  1522. case 'BanditCampDisabled':
  1523. iconPath = "<img src=\"img://icons/quests/person_in_distress_disabled.png\"";
  1524. break;
  1525. case 'BanditCampfire':
  1526. iconPath = "<img src=\"img://icons/quests/bandit_camp_white.png\"";
  1527. break;
  1528. case 'BanditCampfireDisabled':
  1529. iconPath = "<img src=\"img://icons/quests/bandit_camp_disabled.png\"";
  1530. break;
  1531. case 'BossAndTreasure':
  1532. iconPath = "<img src=\"img://icons/quests/guarded_treasure_white.png\"";
  1533. break;
  1534. case 'BossAndTreasureDisabled':
  1535. iconPath = "<img src=\"img://icons/quests/guarded_treasure_disabled.png\"";
  1536. break;
  1537. case 'Contraband':
  1538. case 'ContrabandShip':
  1539. iconPath = "<img src=\"img://icons/quests/contraband_white.png\"";
  1540. break;
  1541. case 'ContrabandDisabled':
  1542. case 'ContrabandShipDisabled':
  1543. iconPath = "<img src=\"img://icons/quests/contraband_disabled.png\"";
  1544. break;
  1545. case 'RescuingTown':
  1546. iconPath = "<img src=\"img://icons/quests/rescuing_town_white.png\"";
  1547. break;
  1548. case 'RescuingTownDisabled':
  1549. iconPath = "<img src=\"img://icons/quests/rescuing_town_disabled.png\"";
  1550. break;
  1551. case 'DungeonCrawl':
  1552. iconPath = "<img src=\"img://icons/quests/dungeon_crawl_white.png\"";
  1553. break;
  1554. case 'DungeonCrawlDisabled':
  1555. iconPath = "<img src=\"img://icons/quests/dungeon_crawl_disabled.png\"";
  1556. break;
  1557. case 'Hideout':
  1558. iconPath = "<img src=\"img://icons/quests/hansa_hideout_white.png\"";
  1559. break;
  1560. case 'HideoutDisabled':
  1561. iconPath = "<img src=\"img://icons/quests/hansa_hideout_disabled.png\"";
  1562. break;
  1563. case 'Plegmund':
  1564. iconPath = "<img src=\"img://icons/quests/lebjoda_statue_white.png\"";
  1565. break;
  1566. case 'PlegmundDisabled':
  1567. iconPath = "<img src=\"img://icons/quests/lebjoda_statue_disabled.png\"";
  1568. break;
  1569. case 'KnightErrant':
  1570. iconPath = "<img src=\"img://icons/quests/knight_errand_white.png\"";
  1571. break;
  1572. case 'KnightErrantDisabled':
  1573. iconPath = "<img src=\"img://icons/quests/knight_errand_disabled.png\"";
  1574. break;
  1575. case 'WineContract':
  1576. iconPath = "<img src=\"img://icons/quests/wine_contract_white.png\"";
  1577. break;
  1578. case 'WineContractDisabled':
  1579. iconPath = "<img src=\"img://icons/quests/wine_contract_disabled.png\"";
  1580. break;
  1581. case 'SignalingStake':
  1582. iconPath = "<img src=\"img://icons/quests/bandit_campfire_white.png\"";
  1583. break;
  1584. case 'SignalingStakeDisabled':
  1585. iconPath = "<img src=\"img://icons/quests/bandit_campfire_disabled.png\"";
  1586. break;
  1587. //misc
  1588. case 'Rift':
  1589. case 'Teleport':
  1590. iconPath = "<img src=\"img://icons/quests/teleport_white.png\"";
  1591. break;
  1592. case 'MagicLamp':
  1593. iconPath = "<img src=\"img://icons/quests/magic_lamp_white.png\"";
  1594. break;
  1595. case 'HorseRaceTarget':
  1596. iconPath = "<img src=\"img://icons/quests/horse_race_target_white.png\"";
  1597. break;
  1598. case 'HorseRaceDummy':
  1599. iconPath = "<img src=\"img://icons/quests/horse_race_dummy_white.png\"";
  1600. break;
  1601. case 'Herb':
  1602. iconPath = "<img src=\"img://icons/quests/herb_white.png\"";
  1603. break;
  1604. case 'Enemy':
  1605. iconPath = "<img src=\"img://icons/quests/enemy_white.png\"";
  1606. break;
  1607. case 'EnemyDead':
  1608. iconPath = "<img src=\"img://icons/quests/dead_body_white.png\"";
  1609. break;
  1610. case 'GenericFocus':
  1611. iconPath = "<img src=\"img://icons/quests/ws_clue_white.png\"";
  1612. break;
  1613. default:
  1614. iconPath = "<img src=\"img://icons/quests/quest_question_white.png\"";
  1615. break;
  1616. }
  1617. }
  1618. iconPath += " width=\"" + GetIconSize() + "\" height=\"" + GetIconSize() + "\">";
  1619. return iconPath;
  1620. }
  1621.  
  1622. function GetQuestAltTextByLevel( marker : SMod3DMarker ) : string
  1623. {
  1624. switch( marker.lvlDiff )
  1625. {
  1626. case QL_NORMAL:
  1627. return " color=\"#89d889\">*";
  1628. case QL_HIGH:
  1629. return " color=\"#ff6655\">*";
  1630. case QL_LOW:
  1631. return " color=\"#cccccc\">*";
  1632. }
  1633. return " >*";
  1634. }
  1635.  
  1636. function GetMarkerAltText( marker : SMod3DMarker ) : string
  1637. {
  1638. var altText : string;
  1639.  
  1640. if( marker.isActiveQuest )
  1641. {
  1642. if( marker.isHighlighted )
  1643. altText = " face=\"$BoldFont\" color=\"#ff9900\">*";
  1644. else
  1645. altText = " color=\"#ff9900\">*";
  1646. }
  1647. else
  1648. {
  1649. switch( marker.visibleType )
  1650. {
  1651. //quests
  1652. case 'QuestReturn':
  1653. altText = " face=\"$BoldFont\" color=\"#ff9900\">?";
  1654. break;
  1655. case 'MonsterQuest':
  1656. case 'TreasureQuest':
  1657. case 'StoryQuest':
  1658. case 'ChapterQuest':
  1659. case 'SideQuest':
  1660. altText = GetQuestAltTextByLevel( marker );
  1661. break;
  1662. case 'QuestAvailable':
  1663. altText = " color=\"#ffcc00\">!";
  1664. break;
  1665. case 'QuestAvailableHoS':
  1666. altText = " color=\"#55aae3\">!";
  1667. break;
  1668. case 'QuestAvailableBaW':
  1669. case 'QuestBelgard':
  1670. case 'QuestCoronata':
  1671. case 'QuestVermentino':
  1672. altText = " color=\"#fb712f\">!";
  1673. break;
  1674. case 'HorseRace':
  1675. case 'BoatRace':
  1676. altText = " color=\"#cd853f\">!";
  1677. break;
  1678. //utility signs
  1679. case 'User1':
  1680. altText = " color=\"#06b952\">x";
  1681. break;
  1682. case 'User2':
  1683. altText = " color=\"#ff6655\">x";
  1684. break;
  1685. case 'User3':
  1686. altText = " color=\"#67a9f8\">x";
  1687. break;
  1688. case 'User4':
  1689. altText = " color=\"#fb712f\">x";
  1690. break;
  1691. case 'Horse':
  1692. case 'Boat':
  1693. case 'RoadSign':
  1694. case 'Harbor':
  1695. case 'Entrance':
  1696. case 'Whetstone':
  1697. case 'ArmorRepairTable':
  1698. case 'WitcherHouse':
  1699. case 'PlayerStash':
  1700. case 'PlayerStashDiscoverable':
  1701. case 'AlchemyTable':
  1702. case 'MutagenDismantle':
  1703. case 'Stables':
  1704. case 'Bookshelf':
  1705. case 'Bed':
  1706. altText = " color=\"#89d889\">@";
  1707. break;
  1708. case 'NoticeBoard':
  1709. altText = " >!";
  1710. break;
  1711. case 'NoticeBoardFull':
  1712. altText = " color=\"#ffcc00\">!";
  1713. break;
  1714. //NPCs
  1715. case 'Cammerlengo':
  1716. case 'DyeMerchant':
  1717. case 'WineMerchant':
  1718. case 'Shopkeeper':
  1719. case 'Blacksmith':
  1720. case 'Armorer':
  1721. case 'Archmaster':
  1722. case 'Innkeeper':
  1723. case 'Enchanter':
  1724. altText = " color=\"#fff68f\">$";
  1725. break;
  1726. case 'Hairdresser':
  1727. altText = " color=\"#67a9f8\">$";
  1728. break;
  1729. case 'Alchemic':
  1730. case 'Herbalist':
  1731. altText = " color=\"#8ebd2f\">$";
  1732. break;
  1733. case 'Prostitute':
  1734. altText = " color=\"#991a1a\">$";
  1735. break;
  1736. case 'Torch':
  1737. altText = " color=\"#ff6655\">+";
  1738. break;
  1739. //POIs
  1740. case 'NotDiscoveredPOI':
  1741. altText = " >?";
  1742. break;
  1743. case 'MonsterNest':
  1744. case 'InfestedVineyard':
  1745. case 'PlaceOfPower':
  1746. case 'TreasureHuntMappin':
  1747. case 'SpoilsOfWar':
  1748. case 'BanditCamp':
  1749. case 'BanditCampfire':
  1750. case 'BossAndTreasure':
  1751. case 'Contraband':
  1752. case 'ContrabandShip':
  1753. case 'RescuingTown':
  1754. case 'DungeonCrawl':
  1755. case 'Hideout':
  1756. case 'Plegmund':
  1757. case 'KnightErrant':
  1758. case 'WineContract':
  1759. case 'SignalingStake':
  1760. altText = " >o";
  1761. break;
  1762. case 'MonsterNestDisabled':
  1763. case 'InfestedVineyardDisabled':
  1764. case 'PlaceOfPowerDisabled':
  1765. case 'TreasureHuntMappinDisabled':
  1766. case 'SpoilsOfWarDisabled':
  1767. case 'BanditCampDisabled':
  1768. case 'BanditCampfireDisabled':
  1769. case 'BossAndTreasureDisabled':
  1770. case 'ContrabandDisabled':
  1771. case 'ContrabandShipDisabled':
  1772. case 'RescuingTownDisabled':
  1773. case 'DungeonCrawlDisabled':
  1774. case 'HideoutDisabled':
  1775. case 'PlegmundDisabled':
  1776. case 'KnightErrantDisabled':
  1777. case 'WineContractDisabled':
  1778. case 'SignalingStakeDisabled':
  1779. altText = " color=\"#999999\">o";
  1780. break;
  1781. //misc
  1782. case 'Rift':
  1783. case 'Teleport':
  1784. altText = " color=\"#cc66ff\">#";
  1785. break;
  1786. case 'MagicLamp':
  1787. altText = " color=\"#00ee33\">#";
  1788. break;
  1789. case 'HorseRaceTarget':
  1790. altText = " color=\"#cc66ff\">x";
  1791. break;
  1792. case 'HorseRaceDummy':
  1793. altText = " color=\"#cc66ff\">x";
  1794. break;
  1795. case 'Herb':
  1796. altText = " color=\"#8ebd2f\">#";
  1797. break;
  1798. case 'Enemy':
  1799. altText = " color=\"#ff6655\">+";
  1800. break;
  1801. case 'EnemyDead':
  1802. altText = " color=\"#ff6655\">x";
  1803. break;
  1804. case 'GenericFocus':
  1805. altText = " color=\"#ff6655\">#";
  1806. break;
  1807. default:
  1808. altText = " >?";
  1809. break;
  1810. }
  1811. }
  1812. altText = "<font size=\"" + config.markersAltTextSize + "\" " + altText + "</font>";
  1813. return altText;
  1814. }
  1815.  
  1816. function GetMarkerAltTextBW( marker : SMod3DMarker ) : string
  1817. {
  1818. var altText : string;
  1819.  
  1820. if( marker.isActiveQuest )
  1821. {
  1822. if( marker.isHighlighted )
  1823. altText = " face=\"$BoldFont\">*";
  1824. else
  1825. altText = " >*";
  1826. }
  1827. else
  1828. {
  1829. switch( marker.visibleType )
  1830. {
  1831. //quests
  1832. case 'QuestReturn':
  1833. altText = " face=\"$BoldFont\">?";
  1834. break;
  1835. case 'MonsterQuest':
  1836. case 'TreasureQuest':
  1837. case 'StoryQuest':
  1838. case 'ChapterQuest':
  1839. case 'SideQuest':
  1840. altText = " >*";
  1841. break;
  1842. case 'QuestAvailable':
  1843. case 'QuestAvailableHoS':
  1844. case 'QuestAvailableBaW':
  1845. case 'QuestBelgard':
  1846. case 'QuestCoronata':
  1847. case 'QuestVermentino':
  1848. case 'HorseRace':
  1849. case 'BoatRace':
  1850. altText = " >!";
  1851. break;
  1852. //utility signs
  1853. case 'User1':
  1854. case 'User2':
  1855. case 'User3':
  1856. case 'User4':
  1857. altText = " >x";
  1858. break;
  1859. case 'Horse':
  1860. case 'Boat':
  1861. case 'RoadSign':
  1862. case 'Harbor':
  1863. case 'Entrance':
  1864. case 'Whetstone':
  1865. case 'ArmorRepairTable':
  1866. case 'WitcherHouse':
  1867. case 'PlayerStash':
  1868. case 'PlayerStashDiscoverable':
  1869. case 'AlchemyTable':
  1870. case 'MutagenDismantle':
  1871. case 'Stables':
  1872. case 'Bookshelf':
  1873. case 'Bed':
  1874. altText = " >@";
  1875. break;
  1876. case 'NoticeBoard':
  1877. case 'NoticeBoardFull':
  1878. altText = " >!";
  1879. break;
  1880. //NPCs
  1881. case 'Cammerlengo':
  1882. case 'DyeMerchant':
  1883. case 'WineMerchant':
  1884. case 'Shopkeeper':
  1885. case 'Blacksmith':
  1886. case 'Armorer':
  1887. case 'Archmaster':
  1888. case 'Innkeeper':
  1889. case 'Enchanter':
  1890. case 'Hairdresser':
  1891. case 'Alchemic':
  1892. case 'Herbalist':
  1893. case 'Prostitute':
  1894. altText = " >$";
  1895. break;
  1896. case 'Torch':
  1897. altText = " >+";
  1898. break;
  1899. //POIs
  1900. case 'NotDiscoveredPOI':
  1901. altText = " >?";
  1902. break;
  1903. case 'MonsterNest':
  1904. case 'InfestedVineyard':
  1905. case 'PlaceOfPower':
  1906. case 'TreasureHuntMappin':
  1907. case 'SpoilsOfWar':
  1908. case 'BanditCamp':
  1909. case 'BanditCampfire':
  1910. case 'BossAndTreasure':
  1911. case 'Contraband':
  1912. case 'ContrabandShip':
  1913. case 'RescuingTown':
  1914. case 'DungeonCrawl':
  1915. case 'Hideout':
  1916. case 'Plegmund':
  1917. case 'KnightErrant':
  1918. case 'WineContract':
  1919. case 'SignalingStake':
  1920. case 'MonsterNestDisabled':
  1921. case 'InfestedVineyardDisabled':
  1922. case 'PlaceOfPowerDisabled':
  1923. case 'TreasureHuntMappinDisabled':
  1924. case 'SpoilsOfWarDisabled':
  1925. case 'BanditCampDisabled':
  1926. case 'BanditCampfireDisabled':
  1927. case 'BossAndTreasureDisabled':
  1928. case 'ContrabandDisabled':
  1929. case 'ContrabandShipDisabled':
  1930. case 'RescuingTownDisabled':
  1931. case 'DungeonCrawlDisabled':
  1932. case 'HideoutDisabled':
  1933. case 'PlegmundDisabled':
  1934. case 'KnightErrantDisabled':
  1935. case 'WineContractDisabled':
  1936. case 'SignalingStakeDisabled':
  1937. altText = " >o";
  1938. break;
  1939. //misc
  1940. case 'Rift':
  1941. case 'Teleport':
  1942. case 'MagicLamp':
  1943. case 'Herb':
  1944. case 'GenericFocus':
  1945. altText = " >#";
  1946. break;
  1947. case 'HorseRaceTarget':
  1948. case 'HorseRaceDummy':
  1949. case 'EnemyDead':
  1950. altText = " >x";
  1951. break;
  1952. case 'Enemy':
  1953. altText = " >+";
  1954. break;
  1955. default:
  1956. altText = " >?";
  1957. break;
  1958. }
  1959. }
  1960. altText = "<font size=\"" + config.markersAltTextSize + "\" " + altText + "</font>";
  1961. return altText;
  1962. }
  1963.  
  1964. //================= on/off conditions ========================
  1965.  
  1966. function ShouldShowMarker( marker : SMod3DMarker ) : bool
  1967. {
  1968. if( marker.pin || marker.force )
  1969. return true;
  1970. if( IsActiveQuest( marker ) )
  1971. return config.markersShowQuests == MV_Show;
  1972. if( IsQuest( marker ) )
  1973. return config.markersShowQuestsAll == MV_Show;
  1974. if( IsUserMain( marker ) )
  1975. return config.markersShowUser == MV_Show;
  1976. if( IsUserAdditional( marker ) )
  1977. return config.markersShowUserAll == MV_Show;
  1978. if( IsMapLocation( marker ) )
  1979. return config.markersShowMapLoc == MV_Show;
  1980. if( IsNPC( marker ) )
  1981. return config.markersShowNPCs == MV_Show;
  1982. if( IsPOIUndiscovered( marker ) )
  1983. return config.markersShowUndiscovered == MV_Show;
  1984. if( IsPOI( marker ) )
  1985. return config.markersShowPOIs == MV_Show;
  1986. if( IsPOIDisabled( marker ) )
  1987. return config.markersShowDisabled == MV_Show;
  1988. if( IsMisc( marker ) )
  1989. return config.markersShowMisc == MV_Show;
  1990. if( IsHerb( marker ) )
  1991. return config.markersShowHerbs == MV_Show;
  1992. if( IsEnemy( marker ) )
  1993. return config.markersShowEnemies == MV_Show;
  1994. if( IsEnemyDead( marker ) )
  1995. return config.markersShowDeadEnemies == MV_Show;
  1996. if( IsWSClue( marker ) )
  1997. return config.markersShowWSClues == MV_Show;
  1998. /*if( pin.type == 'NPC' ||
  1999. pin.type == 'PointOfInterestMappin' )
  2000. continue;*/
  2001. //theGame.witcherLog.AddMessage( "marker: " + marker.visibleType );
  2002. return false;
  2003. }
  2004.  
  2005. function ShouldPinMarker( marker : SMod3DMarker ) : bool
  2006. {
  2007. if( IsActiveQuest( marker ) )
  2008. return config.markersShowQuests == MV_Pin;
  2009. if( IsQuest( marker ) )
  2010. return config.markersShowQuestsAll == MV_Pin;
  2011. if( IsUserMain( marker ) )
  2012. return config.markersShowUser == MV_Pin;
  2013. if( IsUserAdditional( marker ) )
  2014. return config.markersShowUserAll == MV_Pin;
  2015. if( IsMapLocation( marker ) )
  2016. return config.markersShowMapLoc == MV_Pin;
  2017. if( IsNPC( marker ) )
  2018. return config.markersShowNPCs == MV_Pin;
  2019. if( IsPOIUndiscovered( marker ) )
  2020. return config.markersShowUndiscovered == MV_Pin;
  2021. if( IsPOI( marker ) )
  2022. return config.markersShowPOIs == MV_Pin;
  2023. if( IsPOIDisabled( marker ) )
  2024. return config.markersShowDisabled == MV_Pin;
  2025. if( IsMisc( marker ) )
  2026. return config.markersShowMisc == MV_Pin;
  2027. if( IsHerb( marker ) )
  2028. return config.markersShowHerbs == MV_Pin;
  2029. if( IsEnemy( marker ) )
  2030. return config.markersShowEnemies == MV_Pin;
  2031. if( IsEnemyDead( marker ) )
  2032. return config.markersShowDeadEnemies == MV_Pin;
  2033. if( IsWSClue( marker ) )
  2034. return config.markersShowWSClues == MV_Pin;
  2035. return false;
  2036. }
  2037.  
  2038. function ShouldForceMarker( marker : SMod3DMarker ) : bool
  2039. {
  2040. if( IsActiveQuest( marker ) )
  2041. return config.markersShowQuests == MV_Force;
  2042. if( IsQuest( marker ) )
  2043. return config.markersShowQuestsAll == MV_Force;
  2044. if( IsUserMain( marker ) )
  2045. return config.markersShowUser == MV_Force;
  2046. if( IsUserAdditional( marker ) )
  2047. return config.markersShowUserAll == MV_Force;
  2048. if( IsMapLocation( marker ) )
  2049. return config.markersShowMapLoc == MV_Force;
  2050. if( IsNPC( marker ) )
  2051. return config.markersShowNPCs == MV_Force;
  2052. if( IsPOIUndiscovered( marker ) )
  2053. return config.markersShowUndiscovered == MV_Force;
  2054. if( IsPOI( marker ) )
  2055. return config.markersShowPOIs == MV_Force;
  2056. if( IsPOIDisabled( marker ) )
  2057. return config.markersShowDisabled == MV_Force;
  2058. if( IsMisc( marker ) )
  2059. return config.markersShowMisc == MV_Force;
  2060. if( IsHerb( marker ) )
  2061. return config.markersShowHerbs == MV_Force;
  2062. if( IsEnemy( marker ) )
  2063. return config.markersShowEnemies == MV_Force;
  2064. if( IsEnemyDead( marker ) )
  2065. return config.markersShowDeadEnemies == MV_Force;
  2066. if( IsWSClue( marker ) )
  2067. return config.markersShowWSClues == MV_Force;
  2068. return false;
  2069. }
  2070.  
  2071. function IsActiveQuest( marker : SMod3DMarker ) : bool
  2072. {
  2073. return marker.isActiveQuest;
  2074. }
  2075.  
  2076. function IsQuest( marker : SMod3DMarker ) : bool
  2077. {
  2078. switch( marker.visibleType )
  2079. {
  2080. case 'StoryQuest':
  2081. case 'ChapterQuest':
  2082. case 'SideQuest':
  2083. case 'QuestReturn':
  2084. case 'MonsterQuest':
  2085. case 'TreasureQuest':
  2086. case 'QuestAvailable':
  2087. case 'QuestAvailableHoS':
  2088. case 'QuestAvailableBaW':
  2089. case 'QuestBelgard':
  2090. case 'QuestCoronata':
  2091. case 'QuestVermentino':
  2092. case 'HorseRace':
  2093. case 'BoatRace':
  2094. return true;
  2095. }
  2096. return false;
  2097. }
  2098.  
  2099. function IsUserMain( marker : SMod3DMarker ) : bool
  2100. {
  2101. return ( marker.visibleType == 'User1' );
  2102. }
  2103.  
  2104. function IsUserAdditional( marker : SMod3DMarker ) : bool
  2105. {
  2106. switch( marker.visibleType )
  2107. {
  2108. case 'User2':
  2109. case 'User3':
  2110. case 'User4':
  2111. return true;
  2112. }
  2113. return false;
  2114. }
  2115.  
  2116. function IsRoadSign( marker : SMod3DMarker ) : bool
  2117. {
  2118. return ( marker.visibleType == 'RoadSign' );
  2119. }
  2120.  
  2121. function IsMapLocation( marker : SMod3DMarker ) : bool
  2122. {
  2123. switch( marker.visibleType )
  2124. {
  2125. case 'Horse':
  2126. case 'Boat':
  2127. case 'RoadSign':
  2128. case 'Harbor':
  2129. case 'Entrance':
  2130. case 'NoticeBoard':
  2131. case 'NoticeBoardFull':
  2132. case 'Whetstone':
  2133. case 'ArmorRepairTable':
  2134. case 'PlayerStash':
  2135. case 'PlayerStashDiscoverable':
  2136. case 'WitcherHouse':
  2137. case 'AlchemyTable':
  2138. case 'MutagenDismantle':
  2139. case 'Stables':
  2140. case 'Bookshelf':
  2141. case 'Bed':
  2142. return true;
  2143. }
  2144. return false;
  2145. }
  2146.  
  2147. function IsNPC( marker : SMod3DMarker ) : bool
  2148. {
  2149. switch( marker.visibleType )
  2150. {
  2151. case 'Cammerlengo':
  2152. case 'DyeMerchant':
  2153. case 'WineMerchant':
  2154. case 'Shopkeeper':
  2155. case 'Blacksmith':
  2156. case 'Armorer':
  2157. case 'Archmaster':
  2158. case 'Hairdresser':
  2159. case 'Alchemic':
  2160. case 'Herbalist':
  2161. case 'Innkeeper':
  2162. case 'Enchanter':
  2163. case 'Torch':
  2164. case 'Prostitute':
  2165. return true;
  2166. }
  2167. return false;
  2168. }
  2169.  
  2170. function IsPOIUndiscovered( marker : SMod3DMarker ) : bool
  2171. {
  2172. return ( marker.visibleType == 'NotDiscoveredPOI' );
  2173. }
  2174.  
  2175. function IsPOI( marker : SMod3DMarker ) : bool
  2176. {
  2177. switch( marker.visibleType )
  2178. {
  2179. case 'MonsterNest':
  2180. case 'InfestedVineyard':
  2181. case 'PlaceOfPower':
  2182. case 'TreasureHuntMappin':
  2183. case 'SpoilsOfWar':
  2184. case 'BanditCamp':
  2185. case 'BanditCampfire':
  2186. case 'BossAndTreasure':
  2187. case 'Contraband':
  2188. case 'ContrabandShip':
  2189. case 'RescuingTown':
  2190. case 'DungeonCrawl':
  2191. case 'Hideout':
  2192. case 'Plegmund':
  2193. case 'KnightErrant':
  2194. case 'WineContract':
  2195. case 'SignalingStake':
  2196. return true;
  2197. }
  2198. return false;
  2199. }
  2200.  
  2201. function IsPOIDisabled( marker : SMod3DMarker ) : bool
  2202. {
  2203. switch( marker.visibleType )
  2204. {
  2205. case 'MonsterNestDisabled':
  2206. case 'InfestedVineyardDisabled':
  2207. case 'PlaceOfPowerDisabled':
  2208. case 'TreasureHuntMappinDisabled':
  2209. case 'SpoilsOfWarDisabled':
  2210. case 'BanditCampDisabled':
  2211. case 'BanditCampfireDisabled':
  2212. case 'BossAndTreasureDisabled':
  2213. case 'ContrabandDisabled':
  2214. case 'ContrabandShipDisabled':
  2215. case 'RescuingTownDisabled':
  2216. case 'DungeonCrawlDisabled':
  2217. case 'HideoutDisabled':
  2218. case 'PlegmundDisabled':
  2219. case 'KnightErrantDisabled':
  2220. case 'WineContractDisabled':
  2221. case 'SignalingStakeDisabled':
  2222. return true;
  2223. }
  2224. return false;
  2225. }
  2226.  
  2227. function IsHerb( marker : SMod3DMarker ) : bool
  2228. {
  2229. return ( marker.visibleType == 'Herb' );
  2230. }
  2231.  
  2232. function IsEnemy( marker : SMod3DMarker ) : bool
  2233. {
  2234. return ( marker.visibleType == 'Enemy' );
  2235. }
  2236.  
  2237. function IsEnemyDead( marker : SMod3DMarker ) : bool
  2238. {
  2239. return ( marker.visibleType == 'EnemyDead' );
  2240. }
  2241.  
  2242. function IsWSClue( marker : SMod3DMarker ) : bool
  2243. {
  2244. return ( marker.visibleType == 'GenericFocus' );
  2245. }
  2246.  
  2247. function IsMisc( marker : SMod3DMarker ) : bool
  2248. {
  2249. switch( marker.visibleType )
  2250. {
  2251. case 'Rift':
  2252. case 'Teleport':
  2253. case 'MagicLamp':
  2254. case 'HorseRaceTarget':
  2255. case 'HorseRaceDummy':
  2256. return true;
  2257. }
  2258. return false;
  2259. }
  2260.  
  2261. function IsDynamic( marker : SMod3DMarker ) : bool
  2262. {
  2263. return IsNPC( marker ) || IsHerb( marker ) || IsEnemy( marker ) ||
  2264. IsEnemyDead( marker ) || IsWSClue( marker ) || IsMisc( marker );
  2265. }
  2266.  
  2267. //========================== cache markers =================================
  2268.  
  2269. public function SignalCache3DMarkers( questPins : bool )
  2270. {
  2271. if( !isDirty )
  2272. {
  2273. isDirty = true;
  2274. delayedCacheTime = theGame.GetEngineTimeAsSeconds() + 0.5f;
  2275. }
  2276. cacheQuestPins = questPins;
  2277. }
  2278.  
  2279. private function CacheQuestMapPins()
  2280. {
  2281. var mapManager : CCommonMapManager = theGame.GetCommonMapManager();
  2282. var currentWorldPath : string = theGame.GetWorld().GetDepotPath();
  2283. var journalManager : CWitcherJournalManager = theGame.GetJournalManager();
  2284. var trackedQuest : CJournalQuest;
  2285. var highlightedObjective : CJournalQuestObjective;
  2286. var activeQuests : array<CJournalBase>;
  2287. var currentQuest : CJournalQuest;
  2288. var currentPhase : CJournalQuestPhase;
  2289. var currentObjective : CJournalQuestObjective;
  2290. var mapPinInstances : array< SCommonMapPinInstance >;
  2291. var pin : SCommonMapPinInstance;
  2292. var i, j, k, m : int;
  2293. var lvlDiff : EQuestLevel;
  2294.  
  2295. //theGame.witcherLog.AddMessage( "CacheQuestMapPins" );
  2296.  
  2297. FactsAdd( "quest_map_pins_hack_disable_sound" );
  2298.  
  2299. journalManager.GetActivatedOfType( 'CJournalQuest', activeQuests );
  2300. trackedQuest = journalManager.GetTrackedQuest();
  2301. highlightedObjective = journalManager.GetHighlightedObjective();
  2302.  
  2303. cachedQuestPins.Clear();
  2304. cachedQuestLevels.Clear();
  2305.  
  2306. for( i = 0; i < activeQuests.Size(); i += 1 )
  2307. {
  2308. currentQuest = (CJournalQuest)activeQuests[i];
  2309. if( currentQuest == trackedQuest )
  2310. continue;
  2311. if( currentQuest && journalManager.GetEntryStatus( currentQuest ) == JS_Active && ( !config.markerHideActivities || !IsActivity( currentQuest ) ) )
  2312. {
  2313. journalManager.SetTrackedQuest( currentQuest );
  2314. lvlDiff = GetLevelDiff( currentQuest );
  2315. for( j = 0; j < currentQuest.GetNumChildren(); j += 1 )
  2316. {
  2317. currentPhase = (CJournalQuestPhase)currentQuest.GetChild(j);
  2318. if( currentPhase && journalManager.GetEntryStatus( currentPhase ) == JS_Active )
  2319. {
  2320. for( k = 0; k < currentPhase.GetNumChildren(); k += 1 )
  2321. {
  2322. currentObjective = (CJournalQuestObjective)currentPhase.GetChild(k);
  2323. if( currentObjective && journalManager.GetEntryStatus( currentObjective ) == JS_Active )
  2324. {
  2325. journalManager.SetHighlightedObjective( currentObjective );
  2326. //theGame.witcherLog.AddMessage( currentObjective.GetUniqueScriptTag() );
  2327. mapPinInstances = mapManager.GetMapPinInstances( currentWorldPath );
  2328. for( m = 0; m < mapPinInstances.Size(); m += 1 )
  2329. {
  2330. pin = mapPinInstances[m];
  2331. if( !pin.isDisabled && pin.guid == currentObjective.guid && ( pin.isDiscovered || pin.isKnown ) )
  2332. {
  2333. pin.isHighlighted = false;
  2334. cachedQuestPins.PushBack( pin );
  2335. cachedQuestLevels.PushBack( lvlDiff );
  2336. //theGame.witcherLog.AddMessage( GetMarkerDescription( pin ) );
  2337. }
  2338. }
  2339. }
  2340. }
  2341. }
  2342. }
  2343. }
  2344. }
  2345.  
  2346. journalManager.SetTrackedQuest( trackedQuest );
  2347. journalManager.SetHighlightedObjective( highlightedObjective );
  2348.  
  2349. FactsRemove( "quest_map_pins_hack_disable_sound" );
  2350. }
  2351.  
  2352. private function GetLevelDiff( targetQuest : CJournalQuest ) : EQuestLevel
  2353. {
  2354. var i, j : int;
  2355. var levels : C2dArray;
  2356. var qName : string;
  2357. var qLevel : int;
  2358. var lvlDiff : int;
  2359.  
  2360. for( i = 0; i < theGame.questLevelsContainer.Size(); i += 1 )
  2361. {
  2362. levels = theGame.questLevelsContainer[i];
  2363. for( j = 0; j < levels.GetNumRows(); j += 1 )
  2364. {
  2365. qName = levels.GetValueAtAsName(0, j);
  2366. if( qName == targetQuest.baseName )
  2367. {
  2368. qLevel = NameToInt( levels.GetValueAtAsName(1, j) );
  2369. if( qLevel > 1 )
  2370. {
  2371. if( FactsQuerySum( "NewGamePlus" ) > 0 )
  2372. qLevel += theGame.params.GetNewGamePlusLevel();
  2373. lvlDiff = qLevel - thePlayer.GetLevel();
  2374. if( lvlDiff <= -theGame.params.LEVEL_DIFF_HIGH )
  2375. return QL_LOW;
  2376. if( lvlDiff >= theGame.params.LEVEL_DIFF_HIGH )
  2377. return QL_HIGH;
  2378. }
  2379. return QL_NORMAL;
  2380. }
  2381. }
  2382. }
  2383.  
  2384. return QL_NORMAL;
  2385. }
  2386.  
  2387. private function IsActivity( targetQuest : CJournalQuest ) : bool
  2388. {
  2389. switch( NameToString(targetQuest.GetUniqueScriptTag()) )
  2390. {
  2391. case "NML: Fist Fighting BD0558AA-4C809220-048AB2BB-453FC15D":
  2392. case "NVG: Fist Fighting ADB63834-4EFADC15-0B036E9D-D61D4EDD":
  2393. case "SKG: Fist Fight Championship 3B9CD0F0-4CE07724-3F8C88BA-4B34E232":
  2394. case "NML Horse Race: Baron's Men 6E696C48-49E62FEA-947FC48E-AB746137":
  2395. case "MQ3026 Novigrad Horse Racing B3338F99-4362DADA-4BA1F9AD-95F10F44":
  2396. case "SKG Horse Race: Championship 020A073B-472AEE70-ABE51B81-90B67F37":
  2397. case "SKG Horse Race: Ferlund E6D3273C-48408AE2-334D1792-9E1250AA":
  2398. case "SKG Horse Race: Fejrlesdal 459A8157-4727C1B3-9C3A718F-C271FC41":
  2399. case "SKG Horse Race: Hindarsfjall A9CAEC8F-4FB88A21-24A21A94-3F615E3C":
  2400. case "Card Game Meta: Gather All 22A27919-4ECCF7E1-9F536F90-D140CB21":
  2401. case "CG : No Man's Land BECB3BA0-4C293A48-C3C229B6-31A1439A":
  2402. case "CG: Innkeepers 15BA81D3-4E85B6BD-DF83E995-5D7770CE":
  2403. case "CG: Novigrad 40B54F3B-48857011-9EC0B3BC-5A7537E2":
  2404. case "CG: Skellige 72BA3A67-4CFD722A-0A378284-F4E41BC2":
  2405. case "cammerlengo AFAD298F-47B94308-D6D65092-02F3FC2E":
  2406. case "cg700_all_cards 10792209-4257AE39-5B821199-2FFB20EC":
  2407. case "cg700_tournament DBBF356D-4FFC9CC0-29404AAF-D6208B48":
  2408. case "sq701_tournament":
  2409. case "ff701_fistfights AF499A50-4016055D-97A4A787-06336148":
  2410. case "ff701_master D3B2B89D-4E35CBA8-70F0B39C-46F2BF82":
  2411. return true;
  2412. }
  2413. return false;
  2414. }
  2415.  
  2416. //=============================================================================
  2417.  
  2418. function Cache3DMarkers()
  2419. {
  2420. var commonMapManager : CCommonMapManager = theGame.GetCommonMapManager();
  2421. var currentWorldPath : string = theGame.GetWorld().GetDepotPath();
  2422. var mapPinInstances : array< SCommonMapPinInstance >;
  2423. var mapPinInstancesCount : int;
  2424. var i : int;
  2425. var mapPin : SCommonMapPinInstance;
  2426. var marker : SMod3DMarker;
  2427. var questsStartingIdx : int = 0;
  2428. var mStatic, mDynamic : array< SMod3DMarker >;
  2429.  
  2430. cached3DMarkers.Clear();
  2431.  
  2432. //cache all quest map pins (all but tracked quest)
  2433. if( cacheQuestPins )
  2434. CacheQuestMapPins();
  2435.  
  2436. //get map pins (all but non-tracked quests)
  2437. mapPinInstances = commonMapManager.GetMapPinInstances( currentWorldPath );
  2438.  
  2439. cachedWorldPath = currentWorldPath;
  2440. cachedNumPins = mapPinInstances.Size();
  2441. questsStartingIdx = cachedNumPins;
  2442.  
  2443. //append cached map pins for non-tracked quests
  2444. for( i = 0; i < cachedQuestPins.Size(); i += 1 )
  2445. mapPinInstances.PushBack( cachedQuestPins[i] );
  2446.  
  2447. mapPinInstancesCount = mapPinInstances.Size();
  2448.  
  2449. for( i = 0; i < mapPinInstancesCount; i += 1 )
  2450. {
  2451. mapPin = mapPinInstances[i];
  2452. marker.visibleType = mapPin.visibleType;
  2453. marker.isDiscovered = mapPin.isDiscovered;
  2454. marker.isKnown = mapPin.isKnown;
  2455. marker.isDisabled = mapPin.isDisabled;
  2456. marker.position = mapPin.position;
  2457. marker.description = GetMarkerDescription( mapPin );
  2458. ResetQuestMarkerStatus( marker );
  2459. if( i >= questsStartingIdx )
  2460. marker.lvlDiff = cachedQuestLevels[i - questsStartingIdx];
  2461. else if( commonMapManager.IsQuestPinType( mapPin.type ) )
  2462. SetQuestMarkerStatus( marker, mapPin );
  2463. //cached3DMarkers.PushBack( marker );
  2464. //Dynamic markers like herbs and especially WS clues lead to rearranging
  2465. //of array elements and redrawing of oneliners - i.e. they cause flickering
  2466. //when enabled. Without proper map/dictionary proper caching is PITA and
  2467. //this is just a hacky workaround, but oh well.
  2468. if( IsDynamic( marker ) )
  2469. mDynamic.PushBack( marker );
  2470. else
  2471. mStatic.PushBack( marker );
  2472. //theGame.witcherLog.AddMessage( "MAPPIN " + mapPin.id + ": " + mapPin.tag + " : " + mapPin.visibleType );
  2473. }
  2474.  
  2475. for( i = 0; i < mStatic.Size(); i += 1 )
  2476. cached3DMarkers.PushBack( mStatic[i] );
  2477. for( i = 0; i < mDynamic.Size(); i += 1 )
  2478. cached3DMarkers.PushBack( mDynamic[i] );
  2479.  
  2480. isDirty = false;
  2481. cacheQuestPins = false;
  2482. }
  2483.  
  2484. function ResetQuestMarkerStatus( out marker : SMod3DMarker )
  2485. {
  2486. marker.isHighlighted = false;
  2487. marker.isActiveQuest = false;
  2488. }
  2489.  
  2490. function SetQuestMarkerStatus( out marker : SMod3DMarker, pin : SCommonMapPinInstance )
  2491. {
  2492. var journalManager : CWitcherJournalManager = theGame.GetJournalManager();
  2493. var curObjective : CJournalQuestObjective;
  2494. var highlightedObjective : CJournalQuestObjective;
  2495. var curQuest : CJournalQuest;
  2496. var highlightedQuest : CJournalQuest;
  2497.  
  2498. highlightedObjective = journalManager.GetHighlightedObjective();
  2499. curObjective = (CJournalQuestObjective)journalManager.GetEntryByGuid( pin.guid );
  2500. if( curObjective && curObjective == highlightedObjective )
  2501. marker.isHighlighted = true;
  2502. else
  2503. marker.isHighlighted = false;
  2504. highlightedQuest = journalManager.GetHighlightedQuest();
  2505. if( curObjective )
  2506. curQuest = curObjective.GetParentQuest();
  2507. if( curQuest && curQuest == highlightedQuest )
  2508. marker.isActiveQuest = true;
  2509. else
  2510. marker.isActiveQuest = false;
  2511. }
  2512.  
  2513. function GetMarkerDescription( targetPin: SCommonMapPinInstance ) : string
  2514. {
  2515. var definitionManager : CDefinitionsManagerAccessor = theGame.GetDefinitionsManager();
  2516. var journalManager : CWitcherJournalManager = theGame.GetJournalManager();
  2517. var curObjective : CJournalQuestObjective;
  2518. var curQuest : CJournalQuest;
  2519. var label : string;
  2520.  
  2521. switch( targetPin.visibleType )
  2522. {
  2523. case 'StoryQuest':
  2524. case 'ChapterQuest':
  2525. case 'SideQuest':
  2526. case 'MonsterQuest':
  2527. case 'TreasureQuest':
  2528. case 'QuestReturn':
  2529. case 'HorseRace':
  2530. case 'BoatRace':
  2531. case 'QuestBelgard':
  2532. case 'QuestCoronata':
  2533. case 'QuestVermentino':
  2534. curObjective = (CJournalQuestObjective)journalManager.GetEntryByGuid( targetPin.guid );
  2535. if( curObjective )
  2536. {
  2537. curQuest = curObjective.GetParentQuest();
  2538. label = GetLocStringById( curQuest.GetTitleStringId() );
  2539. }
  2540. break;
  2541. case 'Horse':
  2542. case 'Rift':
  2543. case 'Teleport':
  2544. case 'QuestAvailable':
  2545. case 'QuestAvailableHoS':
  2546. case 'QuestAvailableBaW':
  2547. case 'MagicLamp':
  2548. case 'HorseRaceTarget':
  2549. case 'HorseRaceDummy':
  2550. case 'Whetstone':
  2551. case 'Entrance':
  2552. case 'NotDiscoveredPOI':
  2553. label = GetLocStringByKeyExt( StrLower( "map_location_" + targetPin.visibleType ) );
  2554. break;
  2555. case 'MonsterNest':
  2556. case 'MonsterNestDisabled':
  2557. case 'InfestedVineyard':
  2558. case 'InfestedVineyardDisabled':
  2559. case 'PlaceOfPower':
  2560. case 'PlaceOfPowerDisabled':
  2561. case 'TreasureHuntMappin':
  2562. case 'TreasureHuntMappinDisabled':
  2563. case 'SpoilsOfWar':
  2564. case 'SpoilsOfWarDisabled':
  2565. case 'BanditCamp':
  2566. case 'BanditCampDisabled':
  2567. case 'BanditCampfire':
  2568. case 'BanditCampfireDisabled':
  2569. case 'BossAndTreasure':
  2570. case 'BossAndTreasureDisabled':
  2571. case 'Contraband':
  2572. case 'ContrabandDisabled':
  2573. case 'ContrabandShip':
  2574. case 'ContrabandShipDisabled':
  2575. case 'RescuingTown':
  2576. case 'RescuingTownDisabled':
  2577. case 'DungeonCrawl':
  2578. case 'DungeonCrawlDisabled':
  2579. case 'Hideout':
  2580. case 'HideoutDisabled':
  2581. case 'Plegmund':
  2582. case 'PlegmundDisabled':
  2583. case 'KnightErrant':
  2584. case 'KnightErrantDisabled':
  2585. case 'WineContract':
  2586. case 'WineContractDisabled':
  2587. case 'SignalingStake':
  2588. case 'SignalingStakeDisabled':
  2589. case 'AlchemyTable':
  2590. case 'WitcherHouse':
  2591. case 'MutagenDismantle':
  2592. case 'Stables':
  2593. case 'Bookshelf':
  2594. case 'Bed':
  2595. label = GetLocStringByKeyExt( StrLower( "map_location_" + targetPin.type ) );
  2596. break;
  2597. case 'PlayerStash':
  2598. case 'PlayerStashDiscoverable':
  2599. label = GetLocStringByKeyExt( "map_location_playerstash" );
  2600. break;
  2601. case 'Cammerlengo':
  2602. case 'DyeMerchant':
  2603. case 'WineMerchant':
  2604. case 'Shopkeeper':
  2605. case 'Blacksmith':
  2606. case 'Armorer':
  2607. case 'Archmaster':
  2608. case 'Hairdresser':
  2609. label = GetLocStringByKeyExt( StrLower( "map_location_" + targetPin.type ) );
  2610. break;
  2611. case 'Alchemic':
  2612. label = GetLocStringByKeyExt( StrLower( "map_location_alchemic" ) );
  2613. break;
  2614. case 'Herbalist':
  2615. label = GetLocStringByKeyExt( StrLower( "herbalist" ) );
  2616. break;
  2617. case 'Innkeeper':
  2618. label = GetLocStringById( 175619 );
  2619. break;
  2620. case 'Enchanter':
  2621. label = GetLocStringByKeyExt( "panel_map_enchanter_pin_name" );
  2622. break;
  2623. case 'Torch':
  2624. label = GetLocStringByKeyExt( "map_location_torch" );
  2625. break;
  2626. case 'Prostitute':
  2627. label = GetLocStringByKeyExt( "novigrad_courtisan" );
  2628. break;
  2629. case 'ArmorRepairTable':
  2630. label = GetLocStringByKeyExt( "map_location_armor_repair_table" );
  2631. break;
  2632. case 'Herb':
  2633. label= GetLocStringByKeyExt( definitionManager.GetItemLocalisationKeyName( targetPin.tag ) );
  2634. break;
  2635. case 'RoadSign':
  2636. label = GetLocStringByKeyExt( StrLower( "map_location_" + targetPin.tag ) );
  2637. break;
  2638. case 'NoticeBoard':
  2639. case 'NoticeBoardFull':
  2640. label = GetLocStringByKeyExt( StrLower( "map_location_noticeboard" ) );
  2641. break;
  2642. case 'Boat':
  2643. label = GetLocStringByKeyExt( StrLower( "panel_hud_boat" ) );
  2644. break;
  2645. case 'User1':
  2646. case 'User2':
  2647. case 'User3':
  2648. case 'User4':
  2649. label = GetLocStringByKeyExt( StrLower( "map_location_user" ) );
  2650. break;
  2651. default:
  2652. if ( targetPin.customNameId != 0 )
  2653. label = GetLocStringById( targetPin.customNameId );
  2654. else
  2655. label = GetLocStringByKeyExt( StrLower( "map_location_" + targetPin.visibleType ) );
  2656. break;
  2657. }
  2658. return label;
  2659. }
  2660. }
  2661.  
  2662. function Mod3DMarkersSignalCache3DMarkers( questPins : bool )
  2663. {
  2664. //theGame.witcherLog.AddMessage( "Mod3DMarkersSignalCache3DMarkers" );
  2665. ((CR4HudModuleOneliners)((CR4ScriptedHud)theGame.GetHud()).GetHudModule( "OnelinersModule" )).SignalCache3DMarkers( questPins );
  2666. }
  2667. //---=== modFriendlyHUD ===---
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement