<!-- RUBY-BACKUP · part 213 -->
'}
];var PHONE_CALLERS = [];
function buildPhoneCaller(x, y, z){
  var g = new THREE.Group();
  /* a person on the phone */
  var skin = new THREE.MeshStandardMaterial({color: 0xd4a574, roughness: 0.6});
  var shirt = new THREE.MeshStandardMaterial({color: [0x336699, 0x993366, 0x339966, 0x996633][Math.floor(Math.random()*4)], roughness: 0.7});
  var head = new THREE.Mesh(new THREE.SphereGeometry(0.14, 14, 14), skin);
  head.position.y = 1.55; g.add(head);
  var body = new THREE.Mesh(new THREE.CylinderGeometry(0.16, 0.2, 0.9, 10), shirt);
  body.position.y = 1.0; g.add(body);
  /* phone to ear */
  var phone = new THREE.Mesh(new THREE.BoxGeometry(0.04, 0.12, 0.02),
    new THREE.MeshStandardMaterial({color: 0x111111}));
  phone.position.set(0.16, 1.55, 0.02);
  phone.rotation.z = -0.2;
  g.add(phone);
  /* arm up holding phone */
  var arm = new THREE.Mesh(new THREE.CylinderGeometry(0.04, 0.04, 0.4, 8), shirt);
  arm.position.set(0.2, 1.3, 0);
  arm.rotation.z = -0.5;
  g.add(arm);
  [-1,1].forEach(function(s){
    var leg = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.05, 0.55, 8),
      new THREE.MeshStandardMaterial({color: 0x333333}));
    leg.position.set(0, 0.28, s*0.09); g.add(leg);
  });
  g.position.set(x, y, z);
  g.userData.isPhoneCaller = true;
  return g;
}

/* RANDOM KINDNESS GENERATOR */
var KIND_OPENERS = [
  'Hey, did you need',
  'Here, take my',
  'I got extra',
  'You look like you could use',
  'I saved you',
  'Do you want',
  'I brought you',
  'Take this'
];
var KIND_ITEMS = [
  'a charger', 'a battery', 'my jacket', 'a seat',
  'some food', 'my umbrella', 'a warm drink', 'my spot in line',
  'a hand', 'some company', 'my blanket', 'a smile',
  'directions', 'a light', 'my headphones', 'a story'
];
var KIND_CONTEXTS = [
  'your pad died', 'it is cold', 'you look tired',
  'the valley is scary', 'you missed lunch', 'it is raining',
  'you seem lost', 'it has been a long day', 'the court was hard',
  'you dropped something', 'no one should walk alone'
];
var KIND_RESPONSES = [
  'Thank you. Really.',
  'You are too kind.',
  'I will pay it forward.',
  'You are a lifesaver.',
  'I needed that. Thank you.',
  'Why are you so nice?',
  'I owe you one.',
  'This city is full of good people.',
  'Thank you. I will remember this.',
  'You made my day.'
];
var KIND_FOLLOWUPS = [
  'Anytime.', 'That is what we do here.', 'We look out for each other.',
  'No problem at all.', 'I got plenty.', 'Happy to help.',
  'We are all in this together.', 'Just pass it on.'
];
function generateKindCall(){
  var opener = KIND_OPENERS[Math.floor(Math.random()*KIND_OPENERS.length)];
  var item = KIND_ITEMS[Math.floor(Math.random()*KIND_ITEMS.length)];
  var context = KIND_CONTEXTS[Math.floor(Math.random()*KIND_CONTEXTS.length)];
  var response = KIND_RESPONSES[Math.floor(Math.random()*KIND_RESPONSES.length)];
  var followup = KIND_FOLLOWUPS[Math.floor(Math.random()*KIND_FOLLOWUPS.length)];
  /* build natural phrasing */
  var a;
  if(opener.indexOf('did you need')>=0 || opener.indexOf('Do you want')>=0 || opener.indexOf('look like')>=0){
    a = opener+' '+item+'? '+context.charAt(0).toUpperCase()+context.slice(1)+'.';
  }else if(opener.indexOf('saved you')>=0){
    a = opener+' '+item+'. '+context.charAt(0).toUpperCase()+context.slice(1)+'.';
  }else{
    a = opener+' '+item+'.';
  }
  return {a: a, b: response, c: followup};
}

/* FLIRTY — adult mode only */
var FLIRTY_OPENERS = [
  'Is it hot here or is it just you?',
  'Do you come to this plaza often?',
  'I noticed you from across the city.',
  'You have a beautiful laugh.',
  'Can I buy you a drink at the market?',
  'Yo check out that little shorty over there bruh, she lity'
];
var FLIRTY_FOLLOWUPS_EXTRA = [
  'I would not mind taking her to see her zodiac signs.'
];
var FLIRTY_RESPONSES = [
  'Smooth. I like that.',
  'Are you flirting with me?',
  'Maybe. Keep talking.',
  'You are cute. I will give you that.',
  'Is that your best line?'
];
var FLIRTY_FOLLOWUPS = [
  'It worked, did it not?',
  'Only with you.',
  'I try my best.',
  'Wait until you hear my second line.',
  'Let me take you to dinner and find out.'
];
function generateFlirtyCall(){
  var a = FLIRTY_OPENERS[Math.floor(Math.random()*FLIRTY_OPENERS.length)];
  var b = FLIRTY_RESPONSES[Math.floor(Math.random()*FLIRTY_RESPONSES.length)];
  var cc;
  /* the street guy finishes with the zodiac line */
  if(a.indexOf('shorty')>=0){
    cc = 'I would not mind taking her to see her zodiac signs.';
    b = 'Bruh, she heard you.';
  }else{
    cc = FLIRTY_FOLLOWUPS[Math.floor(Math.random()*FLIRTY_FOLLOWUPS.length)];
  }
  return {a: a, b: b, c: cc, flirty: true};
}

/* THE WOMAN AT THE DOOR — adult mode */
function womanAtDoor(){
  try{
    if(typeof isAdult==='function' && !isAdult()){
      codeStatus('18+ only');
      return;
    }
  }catch(e){}
  var div = document.createElement('div');
  div.id = 'woman-door';
  div.style.cssText = 'position:fixed;t